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