在apsw上重现pysqlite的row_factory

hwazgwia  于 2022-12-27  发布在  SQLite
关注(0)|答案(2)|浏览(150)

我一直在尝试从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来达到同样的目的?

lsmepo6l

lsmepo6l1#

披露:我是APSW的作者
是的,非常容易。APSW有一种叫做行跟踪器的东西,在www.example.com上有文档记录http://apidoc.apsw.googlecode.com/hg/execution.html#tracing
每一行都会调用行跟踪器。您可以通过返回None完全跳过该行,或者根据传入的内容设置任何数据类型(这非常适合测试)。如果行跟踪器安装在Connection上,则它会影响所有游标。如果安装在游标上,则只影响该游标。Cursor.getdescription将允许您获取列名和声明的类型。
上面的代码实际上并没有使用row_factory来按数字索引行,这与pysqlite和APSW中的工作方式相同。sqlite3.Row允许按名称索引,因此最后一行代码将是:

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

顺便说一句,还有一个由pysqlite作者和我自己运行的pythonSQlite组,从pysqlite和APSW站点链接到该组。

ztigrdn8

ztigrdn82#

我已经取得了良好的效果:

connection.setrowtrace(row_factory)

def row_factory(cursor, row):
    columns = [t[0] for t in cursor.getdescription()]
    return dict(zip(columns, row))

相关问题