Python/SQLite3:无法提交 - 没有事务处于活动状态

jno*_*jno 16 python sqlite transactions commit

我正在尝试使用Python(传统的,2.7)和SQLite(3)来编写书籍索引器.

代码归结为这一系列SQL语句:

'select count(*) from tag_dict' ()
/* [(30,)] */
'select count(*) from file_meta' ()
/* [(63613,)] */
'begin transaction' ()
'select id from archive where name=?' ('158326-158457.zip',)
/* [(20,)] */
'select id from file where name=? and archive=?' ('158328.fb2', 20)
/* [(122707,)] */
'delete from file_meta where file=?' (122707,)
'commit transaction' ()
# error: cannot commit - no transaction is active
Run Code Online (Sandbox Code Playgroud)

隔离级别为"DEFERRED"("EXCLUSIVE"并不是更好).

我试图使用connection.commit()而不是cursor.execute('commit') - 没有任何用处.

  • 当然,我已经搜索了stackoverflow和网络,但找到的答案是无关紧要的.
  • 出于性能原因,自动提交模式是不可接受的.
  • 我一次只使用唯一的数据库文件.
  • 我的代码在单线程中运行.
  • 所有SQL执行都是通过单个函数完成的,确保我一次只打开一个游标.

那么,这里的交易有什么问题?

如果我使用connection.commit()(注意:没有connection.begin方法!),那么我只是松开了我的数据.

当然,我已经对数据库文件及其目录中的doube/triple/quaruple检查了文件权限.


好吧,正如经常发生的那样,我在提出问题后几分钟就找到了解决方案.

作为一个新手,我不能在8个小时内回答我自己的问题......所以,现在的答案是:

解决方案在这里找到并且包含唯一的想法:

切勿在Python应用程序中的非自动提交模式下使用BEGIN/COMMIT - 仅使用db.commit()和db.rollback()!

这听起来很奇怪,但它确实有效.

jno*_*jno 12

好吧,正如经常发生的那样,我在提出问题后几分钟就找到了解决方案.

解决方案在这里找到并且包含唯一的想法:

切勿在Python应用程序中以非自动提交模式使用BEGIN/COMMIT - 仅使用db.commit()和db.rollback()!

这听起来很奇怪,但它确实有效.