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

python sqlite

16722 观看

7回复

24589 作者的声誉

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

我能以这样的方式执行查询吗?我可以按名字引用列吗?

作者: Ben 的来源 发布者: 2009 年 2 月 23 日

回应 (7)


11

8053 作者的声誉

决定

我不确定这是否是最好的方法,但这是我通常使用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...,这只是除了最简单的表和查询之外的任何维护灾难。

所以,不完全是你要求的答案,但可能仍然具有启发性。

作者: kquinn 发布者: 23.02.2009 09:01

14

9538 作者的声誉

要按名称访问列,请使用row_factoryConnection实例的属性。它可以让你设置一个函数,它的参数cursorrow,并返回不管你愿意的话。有一些内置到pysqlite,即sqlite3.Row做你所问的。

作者: Richard Levasseur 发布者: 23.02.2009 09:25

1

9075 作者的声誉

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文件中。

作者: Christian Witts 发布者: 23.02.2009 03:06

10

8545 作者的声誉

这可以通过在“connect”语句后添加一行来完成:

conn.row_factory = sqlite3.Row

请查看此处的文档:http//docs.python.org/library/sqlite3.html#accessing-columns-by-name-instead-of-by-index

作者: chaimp 发布者: 17.08.2011 09:00

1

451 作者的声誉

kushal对这个论坛的回答很好:

使用DictCursor:

import MySQLdb.cursors

.
.
.
cursor = db.cursor (MySQLdb.cursors.DictCursor)
cursor.execute (query)
rows = cursor.fetchall ()

for row in rows:
print row['employee_id'] 

请注意,列名称区分大小写。

作者: srh snl 发布者: 26.07.2012 06:59

15

14354 作者的声誉

在提出问题并回答问题后的五年中,出现了一个非常简单的解决方案。任何新代码都可以使用行工厂简单地包装连接对象。代码示例:

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'])

这里有一些很好的文档。请享用!

作者: dotancohen 发布者: 18.11.2013 07:27

0

66 作者的声誉

使用光标描述,如下所示:

rows = c.fetchall()
for row in rows:
    for col_i, col in enumerate(row):   
        print("Attribute: {0:30} Value: {1}".format(c.description[col_i][0],col))
作者: svenema 发布者: 11.11.2018 01:37
32x32