我有一些代码,我一直用它来查询MySQL,我希望将它与SQLite一起使用.我真正希望这不会涉及对代码进行太多更改.不幸的是,以下代码不适用于SQLite:
cursor.execute(query) rows = cursor.fetchall() data = [] for row in rows data.append(row["column_name"])
这会出现以下错误:
TypeError: tuple indices must be integers
如果我更改引用以使用列号,它可以正常工作:
data.append(row[1])
我能以这样的方式执行查询吗?我可以按名字引用列吗?
在提出问题并回答问题后的五年中,出现了一个非常简单的解决方案.任何新代码都可以使用行工厂简单地包装连接对象.代码示例:
import sqlite3 conn = sqlite3.connect('./someFile') conn.row_factory = sqlite3.Row // Here's the magic! cursor = conn.execute("SELECT name, age FROM someTable") for row in cursor: print(row['name'])
这里有一些很好的文档.请享用!
要按名称访问列,请使用row_factory
Connection实例的属性.它可以让你设置一个函数,它的参数cursor
和row
,并返回不管你愿意的话.有一些内置到pysqlite,即sqlite3.Row
做你所问的.
我不确定这是否是最好的方法,但这是我通常使用DB-API 2兼容模块检索记录集的方法:
cursor.execute("""SELECT foo, bar, baz, quux FROM table WHERE id = %s;""", (interesting_record_id,)) for foo, bar, baz, quux in cursor.fetchall(): frobnicate(foo + bar, baz * quux)
查询格式化方法是DB-API标准之一,但恰好是Psycopg2的首选方法; 其他DB-API适配器可能会建议一个不同的约定,这将很好.
编写这样的查询,其中隐式元组解包用于处理结果集,对我来说通常比尝试担心将Python变量名称与SQL列名称匹配(我通常只用于删除前缀,然后用于删除前缀)更有效.只有当我使用列名的一个子集,使前缀不再有助于澄清事物时,并且比记住数字列ID 要好得多.
这种风格也可以帮助您避免SELECT * FROM table...
,这只是除了最简单的表和查询之外的任何维护灾难.
所以,不完全是你要求的答案,但可能仍然具有启发性.
这可以通过在"connect"语句后添加一行来完成:
conn.row_factory = sqlite3.Row
请查看此处的文档:http: //docs.python.org/library/sqlite3.html#accessing-columns-by-name-instead-of-by-index