gpt4 book ai didi

python - 将 SQLite 与 APSW 结合使用时为 "BusyError: cannot rollback savepoint - SQL statements in progress"

转载 作者:行者123 更新时间:2023-11-28 21:28:54 25 4
gpt4 key购买 nike

我正在使用 Python apsw 绑定(bind)来处理 SQLite 数据库。代码如下:

with apsw.Connection(path) as t:
c = t.cursor()
c.execute(...)
... more code ...
if c.execute(...).next()[0]:
raise Exception

我希望 with 语句放置一个保存点,而 raise 语句则回滚到该保存点(或者,如果没有什么可引发的,则提交事务)。它提交得很好,但是当有东西要raise时,它拒绝回滚:

BusyError: BusyError: cannot rollback savepoint - SQL statements in progress

我不知道该先看哪里。据我了解,该错误意味着存在另一个连接阻止访问,但从代码来看并非如此,如果是这样,提交时是否也会失败?

SQLite 3.7.7.1,匹配 apsw,Python 2.7。

最佳答案

嗯,我找到了:

if c.execute(...).next()[0]:
raise Exception

问题是,当我使用 next() 获取下一行时,底层游标保持事件状态,准备返回更多行。它必须显式关闭:

if c.execute(...).next()[0]:
c.close()
raise Exception

或者隐式地,通过读出所有数据:

if list(c.execute(...))[0][0]:
raise Exception

更新。为了方便起见,我编写了一个 Python 类,它包装 apsw.Cursor 并提供 a context manager ,所以我可以写:

with Cursor(connection) as c:
c.execute(...)

关于python - 将 SQLite 与 APSW 结合使用时为 "BusyError: cannot rollback savepoint - SQL statements in progress",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6933837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com