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

时间:2012-03-19 15:41:24

标签: python transactions sqlite commit

我正在尝试使用Python(传统的,2.7)和SQLite(3)来编写book indexer

代码归结为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

隔离级别为“DEFERRED”(“EXCLUSIVE”并不是更好)。

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

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

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

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

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


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

作为一个新手,我无法回答8个小时的问题...... 所以,anwer现在在那里:

解决方案是found here,其中包含唯一的想法:

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

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

3 个答案:

答案 0 :(得分:12)

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

解决方案是found here,其中包含唯一的想法:

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

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

答案 1 :(得分:3)

这是一个非常晚的回复,但如果你想要更精细的控制交易,也许可以看一下APSW。我对涉及pysqlite读取的延迟事务运行了一些测试,但它似乎没有正确执行。

答案 2 :(得分:0)

cursor=connection.cursor()
cursor.executemany("insert into person(firstname, lastname) values (?, ?)", persons)
connection.commit()