在apsw上重现pysqlite的row_factory
我一直在尝试把我的代码从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来实现同样的功能呢?
2 个回答
2
我在这个方面取得了不错的效果:
connection.setrowtrace(row_factory)
def row_factory(cursor, row):
columns = [t[0] for t in cursor.getdescription()]
return dict(zip(columns, row))
6
声明:我是APSW的作者
是的,非常简单。APSW有一个叫做行追踪器的功能,详细信息可以在这里找到:http://apidoc.apsw.googlecode.com/hg/execution.html#tracing
行追踪器会在每一行数据时被调用。你可以通过返回None来完全跳过这一行,或者根据传入的数据创建你想要的数据类型(这对于测试非常有用)。如果行追踪器安装在一个连接上,那么它会影响所有的游标。如果安装在某个游标上,那么只有那个游标会受到影响。你可以通过Cursor.getdescription来获取列名和声明的类型。
你上面的代码其实并没有使用行工厂,因为你是通过数字来索引行,这在pysqlite和APSW中都是可以的。sqlite3.Row允许你通过名称来索引,所以最后一行代码应该是:
s[str(row.wbcode)+str(row.Year)]=float(row[query_name])
顺便提一下,还有一个由pysqlite的作者和我自己共同管理的Python SQLite小组,链接可以在pysqlite和APSW的网站上找到。