当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在调用SQLite的python中按名称引用列?》经验,为你挑选了4个好方法。

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

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



1> dotancohen..:

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

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

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



2> Richard Leva..:

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



3> kquinn..:

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

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



4> chaimp..:

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

conn.row_factory = sqlite3.Row

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

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有