繁体   English   中英

如何从Python中的SQLite3数据库查询构建字典列表?

[英]How to build a list of dicts from a SQLite3 database query in Python?

在尝试从Python 2.x的SQLite3查询生成dict列表时,我可以执行以下操作:

import sqlite3
cur = sqlite3.connect('filename.db').cursor()
query = cur.execute('SELECT * FROM A_TABLE')
colname = [ d[0] for d in query.description ]
result_list = []
for r in query.fetchall():
  row = {}
  for i in range(len(colname)):
    row[colname[i]] = r[i]
  result_list.append(row)
  del row

cur.close()
cur.connection.close()
print result_list

这样,我尝试获取字典列表,每个键值对指示列名和行的分配值。

但是尽管工作并且可以合理理解,但嵌套for循环使我认为可能存在简化这一点的Python习惯用法-特别是对理解的一些巧妙使用。 我怀疑也许可以求助于发电机,但是我仍然不太了解如何使用发电机。 所以我问:有没有一种方法可以通过一些生成器和/或字典的理解来“压缩”代码并获得预期的字典列表?

尝试这个:

import sqlite3
cur = sqlite3.connect('filename.db').cursor()
query = cur.execute('SELECT * FROM A_TABLE')
colname = [ d[0] for d in query.description ]
result_list = [ dict(zip(colname, r)) for r in query.fetchall() ]
cur.close()
cur.connection.close()
print result_list

您可以像这样用字典理解替换内部for循环:

row = dict((colname[i], r[i]) for i in range(len(colname)))

您还可以用嵌套在列表推导中的字典推导替换整个内容:

result_list = [dict((colname[i], r[i]) for i in range(len(colname)) for r in query.fetchall()]

我实际上可能建议您坚持使用外部for循环,因为这样看起来更易读。 另外,在我看来, del row是不必要的。 您不能仅依靠Python的垃圾收集器吗?

@David K. Hess是正确的,除了有错字。 第三行应显示为:

query = cur.execute('SELECT * FROM A_TABLE')

我不能只编辑三个字符,也没有评论的声誉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM