Flask执行SQLite参数化查询报TypeError: NoneType is not subscriptable错误求解决
报错根因
你执行res = nextcur.fetchone()时没有查询到匹配的记录,fetchone()返回了None,后续直接对None做['invName']下标访问就触发了该类型错误。你写死invId=1能正常运行,说明是动态传参的问题或代码逻辑漏洞,具体修复方案如下:
1. 修复查询参数类型不匹配问题
动态传入的invid变量类型和inventory表中invId字段的类型不匹配,才会出现写死参数能查到、动态传参查不到的情况:
- 先在代码中打印
invid的类型和实际值确认,比如加一行print(type(invid), invid) - 查询时统一参数和字段类型,比如如果
invId是整数类型,传参时做类型转换:
nextcur = db.execute('SELECT * FROM inventory WHERE invId = ?', [int(invid)])
2. 增加查询结果非空判断
无论参数是否正确,都要先判断fetchone()的返回值是否为空再操作,避免空值触发报错:
res = nextcur.fetchone() if res: OrderItem.productName = res['invName'] else: # 可根据业务需求自定义无匹配时的处理逻辑 OrderItem.productName = '无匹配商品'
3. 修复OrderItem类使用错误
你当前的代码直接修改OrderItem类本身的属性,没有实例化对象,最终返回的列表里所有元素都会共用同一个类的引用,数值会被最后一次循环覆盖,完全不符合预期。每次循环都要实例化新的对象:
# 循环内替换原来的OrderItem属性赋值逻辑 cur_item = OrderItem( ordId = row['orderId'], invId = row['inventoryId'], name = 'none', quantity = row['quantity'], price = row['price'] ) # 后续修改cur_item的属性,不是类本身的属性 nextcur = db.execute('SELECT * FROM inventory WHERE invId = ?', [int(row['inventoryId'])]) res = nextcur.fetchone() if res: cur_item.productName = res['invName'] list.append(cur_item)
内容的提问来源于stack exchange,提问作者txpaintball
相关产品推荐
相关产品推荐

