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
相关产品推荐
相关产品推荐

