Python中如何正确解析MySQL cur.fetchall()返回的查询结果?
解决pymysql查询结果解析问题
看起来你遇到的问题是因为当前游标返回的是字典格式的结果集,而非你预期的元组格式。我来给你拆解原因和解决办法:
为什么会拿到字段标签而不是值?
从你打印的row结果能看出来:
{'post_author': 'USERNAME', 'newposts': Decimal('52'), 'reposts': Decimal('50')}
每个查询结果行都是一个字典——键是数据库字段名,值是对应的数据。当你直接用col1_data, col2_data, col3_data = row这种元组解构方式时,Python会默认遍历字典的键(也就是字段标签),而非对应的值,这就导致你拿到的不是想要的数据。
两种解决办法
方法1:直接使用字典的键取值(推荐,可读性更高)
既然结果是字典,你可以直接通过字段名获取对应的值,这样即使后续查询的字段顺序变动,代码也不会出错:
import pymysql.cursors cur.execute(QUERY) rows = cur.fetchall() for row in rows: # 直接通过字段名取值 post_author = row['post_author'] newposts = row['newposts'] reposts = row['reposts'] # 后续处理逻辑
如果你还是想用解构赋值,也可以针对字典的values()来操作(注意:Python 3.7+ 中字典的values顺序和查询字段顺序一致):
for row in rows: post_author, newposts, reposts = row.values()
方法2:切换为返回元组的游标
如果你更习惯用元组解构的方式,可以在创建游标时使用默认的游标类型(而非DictCursor)。默认情况下,pymysql的Cursor类返回的是元组格式的结果:
import pymysql # 初始化连接时,不要指定cursorclass为DictCursor connection = pymysql.connect( host='你的数据库地址', user='用户名', password='密码', database='目标数据库' ) # 创建普通游标(默认就是返回元组) cur = connection.cursor() cur.execute(QUERY) rows = cur.fetchall() for row in rows: # 现在就能直接解构拿到对应的值了 col1_data, col2_data, col3_data = row
如果你之前的代码里显式设置了cursorclass=pymysql.cursors.DictCursor,只要去掉这个参数就能切换回元组格式的结果。
小总结
- 字典格式结果:可读性强,不易因字段顺序变动出错,适合复杂查询场景
- 元组格式结果:代码更简洁,适合字段固定、顺序明确的简单查询
内容的提问来源于stack exchange,提问作者Bijan
相关产品推荐
相关产品推荐

