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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:15:10