MySQL fetchall() - 如何在dict中而不是在元组内部获取数据

时间:2015-03-12 21:46:48

标签: python mysql dictionary

我的表格列为idcol1col2col3。我以这种方式执行了查询。

cur.execute(query)
row = cur.fetchall()

我是否可以在row内获取dict的数据,即我希望将此结果作为结果传递给 api

cur.fetchall()会产生以下格式((id,col1,col2,col3),(id,col1,col2,col3),(id,col1,col2,col3))

的结果

我可以在

中获得结果吗?
[
   {id:value,col1:value,col2:value,col3:value},
   {id:value,col1:value,col2:value,col3:value},
   {id:value,col1:value,col2:value,col3:value}
]

我知道这个概念,我可以循环fetchall(),并使用字典概念获取值,即

rows = cursor.fetchall()
for row in rows:
   id = row['id']
   col1 = row['col1']
   and so on...

我可以将rows作为字典传递吗?

4 个答案:

答案 0 :(得分:2)

您需要使用cursor.description

“压缩”结果值
columns = [col[0] for col in cursor.description]
rows = [dict(zip(columns, row)) for row in cursor.fetchall()]

答案 1 :(得分:2)

最简单的方法是使用DictCursor

import MySQLdb
...
cursor = db.cursor(MySQLdb.cursors.DictCursor)

您还可以通过将db参数传递给cursor_class

来为connect生成的所有游标设置此项。

不同类型的游标的文档在这里:https://mysqlclient.readthedocs.io/user_guide.html#using-and-extending

答案 2 :(得分:1)

我修改了一点 alecxe 的答案,以压缩游标循环内的每一行。如果您有一个大表,因此您不会在内存中保存所有行,这可能会有所帮助。

cursor = db.execute_sql("select * from something")
columns = [col[0] for col in cursor.description]
for row in cursor.fetchall():
    row = dict(zip(columns, row))
    print(row)

答案 3 :(得分:0)

简单的方法是在光标功能内将字典设置为 True

db = connector.connect(**config)

cursor = db.cursor(dictionary=True)