【问题标题】:How can I create a dictionary from a list of k:v tuples returned from a SQL query?如何从 SQL 查询返回的 k:v 元组列表创建字典?
【发布时间】:2016-09-05 14:03:23
【问题描述】:

我的 SQL (sqlite3) 查询是这样的:

SELECT id, name FROM mytable;

这会返回大量行。我想根据这些结果创建一个字典,我可以在其中查找给定 id 的名称。

我发现的其他答案似乎是根据 SQL 结果创建字典,但它们使用列标签作为键——我对此不感兴趣。

示例表:

id    | name
------+--------
foo   | bar
baz   | foobar

所需的字典:

{
    'foo': 'bar',
    'baz': 'foobar'
}

【问题讨论】:

标签: python sql dictionary sqlite


【解决方案1】:

您可以遍历行(result cursor is iterable)、unpack 键和值,然后使用 dict comprehension 组合结果:

desired_dict = {k:v for k, v in c.execute('SELECT id, name FROM MyTable')}

我喜欢使用 dict 理解,因为我可以在添加到字典之前对结果进行额外处理(例如更改大小写、转换为十进制或日期时间等)。

也就是说,如果你想直接进入 dict,ozgur 有更短、更快的方法,即直接调用 dict()

desired_dict = dict(c.execute('SELECT id, name FROM MyTable'))

这是一个实际的示例会话,演示了从开始到结束的过程:

>>> import sqlite3
>>> c = sqlite3.connect('tmp.db')
>>> c.execute('CREATE TABLE MyTable (id text, name text)')
<sqlite3.Cursor object at 0x106227f80>
>>> c.execute("INSERT INTO MyTable VALUES ('abc', 'Alpha')")
<sqlite3.Cursor object at 0x106283810>
>>> c.execute("INSERT INTO MyTable VALUES ('def', 'Beta')")
<sqlite3.Cursor object at 0x106227f80>
>>> c.execute("INSERT INTO MyTable VALUES ('ghi', 'Gamma')")
<sqlite3.Cursor object at 0x106283810>
>>> c.commit()
>>> c.close()
>>> 
>>> c = sqlite3.connect('tmp.db')
>>> {k:v for k, v in c.execute('SELECT id, name FROM MyTable')}
{'ghi': 'Gamma', 'def': 'Beta', 'abc': 'Alpha'}

【讨论】:

  • 使用你原来的建议,我得到这个错误:ValueError: need more than 1 value to unpack
  • @ComtriS 我添加了一个实际会话来演示从开始到结束的所有步骤。这如何帮助您解决问题:-)
【解决方案2】:

从 cursor 返回的结果是一个 2 元素元组的列表,因此您可以将其转换为字典,因为每个元组的第一项是唯一值:

result = dict(cursor.execute("SELECT id, name FROM mytable"))

【讨论】:

  • 我试过了,没用。我收到此错误:ValueError:字典更新序列元素 #0 的长度为 1; 2 是必需的
  • 不,我列出的查询是同一个查询(表名不同,但仅此而已)。
  • 查询结果如何?
  • 它似乎正在返回一个字典列表。所以我认为这个错误与只有一个元素(一个字典)返回有关。
  • 我发现了问题所在。我正在使用一个干扰输出的 row_factory (由另一个答案提供)。感谢您的帮助。
【解决方案3】:

假设你在 Python 中得到你的 sql 查询结果,类似于

db_conn = sqlite3.connect('text.db') cur = db_conn.cursor() cur.execute('''select id, name from mytable''')

那么就可以在cur.fetchall()的返回中得到所有的查询结果。 结果将是一个元组列表,每个元组将类似于 (id,name)。

知道了这一点,那么把它转成字典就是小菜一碟了,只是:

mydict = {} for item in cur.fetchall(): mydict[item[0]] = item[1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2011-08-29
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    相关资源
    最近更新 更多