在apsw上重现pysqlite的row_factory

时间:2010-09-30 21:35:40

标签: python sqlite pysqlite

我一直试图从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 个答案:

答案 0 :(得分:6)

披露:我是APSW的作者

是的,很容易。 APSW在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])

BTW还有一个由pysqlite作者和我自己从pysqlite和APSW站点链接的Python SQLite组。

答案 1 :(得分:0)

我的成绩很好:

connection.setrowtrace(row_factory)

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