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接受的答案。