在apsw上重现pysqlite的row_factory

3 投票
2 回答
1002 浏览
提问于 2025-04-16 04:49

我一直在尝试把我的代码从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的网站上找到。

撰写回答