Python/SQLite3:无法提交-没有事务是acti

2024-03-29 07:02:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用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和Net,但是找到的答案是不相关的。
  • 由于性能原因,自动提交模式不可接受。
  • 我一次使用唯一的数据库文件。
  • 我的代码是单线程运行的。
  • 所有的SQL执行都是通过一个函数完成的,这个函数确保我一次只打开一个游标。

那么,这里的交易怎么了?

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

当然,我已经对数据库文件及其目录的文件权限进行了double/triple/d检查。


好吧,我经常在提出问题后一分钟就找到了解决办法。

作为一个新手,我有8个小时不能回答自己的问题。。。 所以,答案就在这里:

解决方案是found here,由唯一的想法组成:

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

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


Tags: 文件代码fromidsqlcountconnectionwhere
3条回答

这是一个相当晚的响应,但是如果您希望对事务进行更精细的控制,可以查看APSW。我在pysqlite上运行了一些涉及读取的延迟事务测试,但它似乎没有正确执行。

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

好吧,我经常在提出问题后一分钟就找到了解决办法。

解决方案是found here,由唯一的想法组成:

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

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

相关问题 更多 >