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

Sqlite带returning的查询未fetch结果就commit报OperationalError原因

问题解答

错误成因

SQLite 中执行带 returning 子句的写操作(insert/update/delete)后,游标会默认处于活跃状态:数据库认为你仍需要读取 returning 返回的结果集,会将当前事务标记为「存在正在执行的SQL语句」,此时直接调用commit()就会触发对应的OperationalError。
普通无 returning 子句的写操作执行完成后没有待返回的结果集,游标会直接进入闲置状态,因此可以直接提交无报错。

解决方法

  • 方法1(推荐):主动拉取 returning 返回的结果,提交前调用游标读结果的方法即可,哪怕你不需要返回值也要调用一次清空游标活跃状态:
    query2 = 'insert into products (id, name, price) values (?,?,?) returning id'
    cursor.execute(query2, (2, 'cherry', 250))
    # 主动拉取结果,同时可以拿到返回的ID直接使用
    inserted_id = cursor.fetchone()[0]
    conn.commit()
    
  • 方法2:如果完全不需要获取返回的字段值,直接删除语句中的 returning 子句即可,和普通插入逻辑一致,执行后可以直接提交。
  • 方法3:也可以在提交前先调用cursor.close()关闭当前游标,再执行提交操作。

内容的提问来源于stack exchange,提问作者mrosa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 22:06:02