3

pysqliteからapswに移行しようとしていますが、row_factory関数を再現する方法が見つかりません。

これは私の元のコードです:

connection = sqlite3.connect("db.db3")
connection.row_factory = sqlite3.Row
cursor = connection.cursor()

そして私はそれを次のように使用します:

query = """ SELECT wbcode, Year, """+query_name+""" 
            FROM innovotable WHERE commodity='"""+commodity_name+"""'  and 
            """+query_name+""" != 'NULL' """
rows = cursor.execute(query)
for row in rows:
    s[str(row[0])+str(row[1])] = float(row[2])

これと同じ目的でapswを使用することは可能ですか?

4

2 に答える 2

6

開示:私はAPSWの作者です

はい、とても簡単です。APSWには、http: //apidoc.apsw.googlecode.com/hg/execution.html#tracingに記載されている行トレーサーと呼ばれるものがあります。

行トレーサーは、各行で呼び出されます。Noneを返すことで行を完全にスキップするか、渡されたものに基づいて必要なデータ型を作成できます(これはテストに最適です)。行トレーサーが接続にインストールされている場合、すべてのカーソルに影響します。カーソル上にある場合は、そのカーソルのみが影響を受けます。Cursor.getdescriptionを使用すると、列名と宣言されたタイプを取得できます。

上記のコードでは、pysqliteとAPSWの場合と同じように機能する番号で行にインデックスを付けるため、実際にはrow_factoryを使用していません。sqlite3.Rowでは名前でインデックスを作成できるため、コードの最後の行は次のようになります。

s[str(row.wbcode)+str(row.Year)]=float(row[query_name])

ところで、pysqliteの作者と私がpysqliteとAPSWサイトからリンクしているPythonSQLiteグループもあります。

于 2010-10-01T02:26:53.983 に答える
1

私は良い結果を出しました:

connection.setrowtrace(row_factory)

def row_factory(cursor, row):
    columns = [t[0] for t in cursor.getdescription()]
    return dict(zip(columns, row))
于 2016-11-07T12:28:51.283 に答える