在JetBrains PyCharm中运行Python代码时遇'int' object not subscriptable错误
解决'int' object not subscriptable错误
先来说说这个错误的本质:当你尝试对一个整数(int类型)使用下标操作(比如something[0])时就会触发它——整数显然不是可以通过下标访问的序列类型(比如列表、元组)。
看你的代码,问题出在循环处理查询结果的部分:
for row in cursor: result.append(row[0]) result.append(row[1]) result.append(row[2]) re... # 这里应该是继续append其他row元素
你的函数注释明确说明要返回元组的列表,但当前代码把每一行的每个元素都单独追加到result里,最后result会变成一个扁平的列表,比如:[1, '2024-05-20', '张三', 'Python开发', ...]
而不是预期的:[(1, '2024-05-20', '张三', 'Python开发', ...), (2, '2024-05-19', '李四', 'Java开发', ...)]
如果之后你尝试遍历这个扁平列表,对其中的整数元素做下标操作(比如想取元组里的某个字段),自然就会抛出这个错误。
修正方案
直接把整个row元组追加到result里就可以了,不需要逐个元素拆分:
def position_list(db, limit=10): """Return a list of positions ordered by date db is a database connection return at most limit positions (default 10) Returns a list of tuples (id, timestamp, owner, title, location, company, description) """ cursor = db.cursor() # 注意:你的SQL里少了location和company字段,和注释的返回元组字段不匹配,建议补上 sql = "SELECT id, timestamp, owner, title, location, company, description FROM positions ORDER BY timestamp DESC LIMIT %s" cursor.execute(sql, (limit,)) # 用参数化查询更安全,避免SQL注入 result = [] for row in cursor: result.append(row) # 直接追加整个行元组 return result
额外提示
- 你的SQL语句里只查询了
id, timestamp, owner, title, description,但函数注释说要返回包含location, company的元组,记得把这两个字段加到SQL里,避免返回的元组字段缺失。 - 用参数化查询(
cursor.execute(sql, (limit,)))代替直接把limit写死在SQL里,既灵活又能防止SQL注入风险。
内容的提问来源于stack exchange,提问作者Anim Rahman
相关产品推荐
相关产品推荐

