MySQL结合Python Flask开发时遭遇TypeError: list indices must be integers or slices, not str错误求助
问题排查与解决:TypeError: list indices must be integers or slices, not str
嘿,这个错误我之前开发Flask+MySQL项目时也踩过坑,很容易搞混!咱们来一步步拆解问题:
错误原因
你用了cursor.fetchall()方法,这个方法返回的是所有匹配查询结果的列表——哪怕数据库里只有一条符合code = %s的记录,它也会返回一个包含单个字典的列表,而不是直接返回单个字典。
所以你现在的变量row其实是个列表,自然不能用row['code']这种字符串索引去取值,这就触发了TypeError。
两种解决方法
方法1:改用fetchone()(推荐,因为产品code通常是唯一的)
如果你的product表中code是唯一字段,确定只会返回一条记录,直接用fetchone()替代fetchall(),它会直接返回单个字典(没有匹配结果时返回None):
@app.route('/', methods = ['POST']) def add_product_to_cart(): # 先确保_quantity和_code已定义,建议补充完整的变量赋值逻辑 if _quantity and _code and request.method == "POST": conn = mysql.connect() cursor = conn.cursor(pymysql.cursors.DictCursor) cursor.execute("SELECT * FROM product WHERE code = %s", (_code)) row = cursor.fetchone() # 替换fetchall()为fetchone() if row: # 先判断是否找到对应产品,避免空值报错 itemArray = { row['code'] : {'name' : row['name'], 'code' : row['code'], 'quantity' : _quantity, 'price' : row['price'], 'image' : row['image'], 'total_price': _quantity * row['price']}} # 后续逻辑...
方法2:从fetchall()返回的列表中取第一条记录
如果你确实需要保留fetchall()(比如存在多条匹配的场景,但你只需要第一条),可以通过索引[0]获取列表中的第一个元素:
@app.route('/', methods = ['POST']) def add_product_to_cart(): if _quantity and _code and request.method == "POST": conn = mysql.connect() cursor = conn.cursor(pymysql.cursors.DictCursor) cursor.execute("SELECT * FROM product WHERE code = %s", (_code)) rows = cursor.fetchall() # 变量名改成rows更清晰 if rows: # 检查是否有查询结果 row = rows[0] # 取第一条记录 itemArray = { row['code'] : {'name' : row['name'], 'code' : row['code'], 'quantity' : _quantity, 'price' : row['price'], 'image' : row['image'], 'total_price': _quantity * row['price']}} # 后续逻辑...
额外提醒
一定要记得在使用row之前判断是否为空,避免因为用户输入了不存在的产品code而触发新的空值错误哦!
内容的提问来源于stack exchange,提问作者Squall




