Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python MySQL fetchall()-如何在dict而不是元组中获取数据_Python_Mysql_Dictionary - Fatal编程技术网

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

Python MySQL fetchall()-如何在dict而不是元组中获取数据,python,mysql,dictionary,Python,Mysql,Dictionary,我有一个表,它的列有id,col1,col2,col3。我以这种方式执行查询 cur.execute(query) row = cur.fetchall() 我可以在目录中获取行的数据吗,即我想将此结果传递给api cur.fetchall()将生成以下格式的结果((id,col1,col2,col3),(id,col1,col2,col3),(id,col1,col2,col3)) 我能得到结果吗 [ {id:value,col1:value,col2:value,col3:value

我有一个表,它的列有
id
col1
col2
col3
。我以这种方式执行查询

cur.execute(query)
row = cur.fetchall()
我可以在
目录
中获取
的数据吗,即我想将此结果传递给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...
我可以将
作为字典传递吗???

您需要使用
光标“压缩”结果值。说明

columns = [col[0] for col in cursor.description]
rows = [dict(zip(columns, row)) for row in cursor.fetchall()]

如果您使用
mysql connector
库连接到数据库,最简单的方法是将
dictionary
设置为
True
insidecursor函数:

db = connector.connect(**config)

cursor = db.cursor(dictionary=True)

最简单的方法是使用
命令光标

import MySQLdb
...
cursor = db.cursor(MySQLdb.cursors.DictCursor)
通过将
cursor\u class
参数传递到
connect


不同类型游标的文档在这里:

我修改了一点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)

这与循环
fetchall()
和创建dict是一样的,这很耗时。有什么直接的解决办法吗?@user1162512恐怕没有什么内置的。我已经在需要的时候使用这种方法有一段时间了。作为一种替代方法,您可以使用一种ORM来隐藏它是如何做到的,但它会给您一个对字段具有“点”访问权限的模型对象。@user1162512顺便说一句,据我回忆,Django使用相同的方法将模型字段与查询结果相匹配。我是Django的热心用户,知道Django的这一功能,但是我不知道它是如何工作的,因此我想知道原始MySQL的工作原理。非常感谢:)@user1162512是的,还有
信息\u架构。使用了列
,请参阅。TypeError:cursor()得到了一个意外的关键字参数“dictionary”@caram,这是因为您使用的是
MySQLdb
连接器,此解决方案适用于
mysql连接器
。非常好,这应该是IMHO接受的答案。