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

如何通过列名访问SQL行数据?解决fetchall()后的TypeError问题

当然可以用列名访问SQL行数据!

你遇到的TypeError: tuple indices must be integers, not str是因为默认情况下,fetchall()返回的是元组的列表——元组只能用整数索引定位元素,自然不能用列名字符串啦。不过我们有几种简单的方法解决这个问题:

方法1:使用字典游标(最推荐)

大多数Python数据库连接库(比如sqlite3、psycopg2、mysql-connector)都提供了字典类型的游标,用它执行查询后,返回的每一行数据都是可以通过列名访问的对象(或字典)。

举几个常见库的例子:

SQLite3

import sqlite3

# 连接数据库
conn = sqlite3.connect('your_database.db')
# 指定使用sqlite3.Row类型的游标(既支持列名索引,也支持整数索引)
cursor = conn.cursor(cursor_factory=sqlite3.Row)

# 执行查询
cursor.execute("SELECT user_id, username, email FROM users")
rows = cursor.fetchall()

# 用列名访问数据
for row in rows:
    print(f"用户名:{row['username']},邮箱:{row['email']}")

conn.close()

PostgreSQL(psycopg2)

import psycopg2
from psycopg2.extras import DictCursor

conn = psycopg2.connect("dbname=your_db user=your_user password=your_pwd")
# 使用DictCursor
cursor = conn.cursor(cursor_factory=DictCursor)

cursor.execute("SELECT id, title FROM posts")
rows = cursor.fetchall()

for row in rows:
    print(f"文章标题:{row['title']}")

conn.close()

方法2:手动将元组转换为字典

如果因为某些原因不能修改游标类型,你可以先获取查询结果的列名,再把每行元组和列名配对成字典:

import sqlite3

conn = sqlite3.connect('your_database.db')
cursor = conn.cursor()

cursor.execute("SELECT user_id, username, email FROM users")
# 获取列名列表:cursor.description里每个元素的第一个值就是列名
column_names = [col[0] for col in cursor.description]
rows = cursor.fetchall()

# 将每行元组转换为字典
dict_rows = [dict(zip(column_names, row)) for row in rows]

# 现在可以用列名访问了
for row in dict_rows:
    print(row['username'])

conn.close()

两种方法都能解决你的问题,个人更推荐第一种——用字典游标不仅代码更简洁,性能也更好,毕竟是库原生支持的功能。

内容的提问来源于stack exchange,提问作者GT.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:18:28