You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动