如何在调用SQLite的python中按名称引用列?

时间:2009-02-23 08:50:12

标签: python sqlite

我有一些代码,我一直用来查询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])

我是否可以通过名称引用列来执行查询?

7 个答案:

答案 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属性。它允许您设置一个带有参数cursorrow的函数,并返回您想要的任何内容。有一些内置到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