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
相关产品推荐
相关产品推荐

