You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中cursor.fetchall()返回元组列表的原因及解决方法

问题原因

数据库游标返回的每一行结果都会被封装成元组,这是为了适配SQL查询的本质——结果集是由「行」组成的,哪怕你只查询了一列,每一行依然会被当作一个包含单个元素的元组返回,这样不管你查1列还是多列,返回格式都能保持一致,避免后续逻辑因为列数变化出问题。

另外你预期的('blob')其实不是元组,只是被括号包裹的字符串,本质和直接写'blob'完全一样,你真正需要的应该是纯字符串组成的列表:['blob', 'Clothes', ...]。

解决方法

方法1:用列表推导式快速转换(最简便)

不需要写冗余循环,一行代码就能把元组列表转成字符串列表:

result = cursor.fetchall()
categories = [row[0] for row in result]

方法2:修改游标类型(直接返回单元素值)

如果你用的是mysql-connector-python,可以在创建游标时指定cursorclass为MySQLCursorScalar,它会自动把单列查询的每一行结果转换成单个值:

cursor = mydb.cursor(cursorclass=mydb.cursor.MySQLCursorScalar)
cursor.execute(category_query)
result = cursor.fetchall()  # 此时result就是['blob', 'Clothes', ...]

注意:这个游标类型仅适用于单列查询,多列查询时会报错。

方法3:逐行获取并处理

如果结果集很大,不想一次性把所有数据加载到内存,可以用fetchone()循环处理:

categories = []
cursor.execute(category_query)
row = cursor.fetchone()
while row:
    categories.append(row[0])
    row = cursor.fetchone()

内容的提问来源于stack exchange,提问作者Dan'l

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:35:03