我正在尝试使用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
隔离级别是“延迟”的(“独占”也不会更好)。
我尝试使用connection.commit()而不是cursor.execute('commit') --没有发生任何有用的事情。
当然,我已经搜索了stackoverflow和Net,但由于性能原因,我找到的答案是irrelevant.
< code >H115所有SQL执行都是通过单个函数完成的,该函数确保我一次只打开一个游标。
那么,这里的事务有什么问题呢?
如果我使用connection.commit() (注意:没有connection.begin方法!),那么我只是丢失了数据。
当然,我已经对数据库文件及其目录的文件权限进行了两次/triple/d检查。
发布于 2012-03-20 13:44:38
嗯,就像经常发生的那样,我在提出问题一分钟后就找到了解决方案。
解决方案是found here,由唯一的想法组成:
永远不要在Python应用程序的非自动提交模式下使用BEGIN/COMMIT -只使用db.commit()和db.rollback()!
这听起来很奇怪,但它确实有效。
发布于 2013-08-28 02:33:49
这是一个相当晚的响应,但是如果您想要对事务进行更细粒度的控制,可以看看APSW。我在涉及pysqlite读取的延迟事务上运行了几个测试,它似乎不能正确执行。
发布于 2013-12-11 07:04:24
cursor=connection.cursor()
cursor.executemany("insert into person(firstname, lastname) values (?, ?)", persons)
connection.commit()
https://stackoverflow.com/questions/9773200
复制相似问题