【问题标题】:Reproduce pysqlite's row_factory on apsw在apsw上重现pysqlite的row_factory
【发布时间】:2010-09-30 21:35:40
【问题描述】:

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

【问题讨论】:

    标签: python sqlite pysqlite


    【解决方案1】:

    披露:我是 APSW 的作者

    是的,非常容易。 APSW 在 http://apidoc.apsw.googlecode.com/hg/execution.html#tracing

    上记录了一种称为行跟踪器的东西

    每行都会调用行跟踪器。您可以通过返回 None 来完全跳过该行,或者根据传入的内容创建您想要的任何数据类型(这对于测试非常有用)。如果行跟踪器安装在连接上,那么它会影响所有游标。如果在游标上,则只有该游标受到影响。 Cursor.getdescription 将让您获取列名和声明的类型。

    您上面的代码实际上并没有使用 row_factory,因为您按数字索引行,这在 pysqlite 和 APSW 中的工作原理。 sqlite3.Row 确实允许您按名称索引,因此最后一行代码是:

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

    顺便说一句,还有一个 Python SQLite 组,由 pysqlite 作者和我自己从 pysqlite 和 APSW 站点链接到。

    【讨论】:

      【解决方案2】:

      我在以下方面取得了不错的成绩:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-15
        • 2017-08-07
        • 1970-01-01
        • 2022-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多