我有一些代码,我一直用来查询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])
我是否可以通过名称引用列来执行查询?
答案 0 :(得分:20)
在提出问题并回答问题后的五年中,出现了一个非常简单的解决方案。任何新代码都可以使用行工厂简单地包装连接对象。代码示例:
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'])
以下是一些fine docs。享受!
答案 1 :(得分:15)
要按名称访问列,请使用Connection实例的row_factory
属性。它允许您设置一个带有参数cursor
和row
的函数,并返回您想要的任何内容。有一些内置到pysqlite,即sqlite3.Row
,它可以做你所问的。
答案 2 :(得分: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)
查询格式化方法是DB-API标准之一,但恰好是Psycopg2的首选方法;其他DB-API适配器可能会建议不同的约定。
编写这样的查询,其中隐式元组解包用于处理结果集,对我来说通常比尝试担心将Python变量名称与SQL列名称匹配(我通常只用于删除前缀)更有效,然后,只有当我使用列名的一个子集,使得前缀不再有助于澄清事物时,并且 比记住数字列ID更好。
此样式还可以帮助您避免SELECT * FROM table...
,这只是除了最简单的表和查询之外的任何维护灾难。
所以,不是你要求的答案,但可能还是很有启发性。
答案 3 :(得分:10)
这可以通过在“connect”语句后添加一行来完成:
conn.row_factory = sqlite3.Row
查看此处的文档: http://docs.python.org/library/sqlite3.html#accessing-columns-by-name-instead-of-by-index
答案 4 :(得分:2)
kushal对this forum的回答很好:
使用DictCursor:
import MySQLdb.cursors
.
.
.
cursor = db.cursor (MySQLdb.cursors.DictCursor)
cursor.execute (query)
rows = cursor.fetchall ()
for row in rows:
print row['employee_id']
请注意,列名称区分大小写。
答案 5 :(得分:1)
SQLite API支持cursor.description,因此您可以像这样轻松地执行此操作
headers = {}
for record in cursor.fetchall():
if not headers:
headers = dict((desc[0], idx) for idx,desc in cursor.description))
data.append(record[headers['column_name']])
有点啰嗦但完成工作。我注意到他们甚至把它放在dict_factory下的factory.py文件中。
答案 6 :(得分:0)
使用游标描述,如下所示:
df = pd.read_csv('ratings.csv',
dtype= {'userId':np.int32,
'movieId':np.int32,
'rating':np.float64,
'timestamp':np.int64})
print (df.head())
user_id movie_id rating timestamp
0 1 1193 5.0 978300760
1 1 661 3.0 978302109
2 1 914 3.0 978301968
3 1 3408 4.0 978300275
4 1 2355 5.0 978824291