python sqlite 3:回滚保存点失败
def rollback_savepoint(self):
try:
self.db.execute("rollback to savepoint pt;")
except:
print "roll back to save point failed"
else:
print "Roll back to save point. Done"
在上面的代码片段中,它说“回退到保存点失败”。 出了什么问题?python sqlite 3:回滚保存点失败
编辑: 我改变了代码如下图所示,收到错误消息
self.db.execute("savepoint pt;")
print "Save point created"
self.cursor.execute("insert into STK values(33)")
self.db.execute("rollback to savepoint pt;")
错误
Save point created
Traceback (most recent call last):
File "open_db.py", line 77, in <module>
obj1.save_point()
File "open_db.py", line 63, in save_point
self.db.execute("rollback to savepoint pt;")
sqlite3.OperationalError: no such savepoint: pt
千万不要赶你不处理异常。让它升起,这样你可以得到有用的错误信息和回溯。
例子:
>>> c.execute('rollback to savepoint pt;')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
sqlite3.OperationalError: no such savepoint: pt
从回溯我可以知道错误是没有pt
保存点。我不知道你的问题,因为你隐藏了最能帮助你的信息。捕捉所有错误并打印一些“失败”信息是愚蠢的 - 回溯更有用,并更好地解释问题。
编辑: 您的代码是不完全是一个易于运行测试用例,但通过阅读它,我能自己编写一些代码来重现问题。我无法解释究竟发生了什么,但我找到了一种方法使其工作 - 与how sqlite3 module deals with transactions有关。
这里是我的全部,可运行的例子:
import sqlite3
from tempfile import NamedTemporaryFile as NF
import os
f = NF(suffix='.db', delete=False).name
db = sqlite3.connect(f)
try:
db.execute('CREATE TABLE foo (id INTEGER PRIMARY KEY, data VARCHAR)')
db.isolation_level = None
db.execute('INSERT INTO foo (data) values (?)', ('hello',))
db.execute('INSERT INTO foo (data) values (?)', ('world',))
db.execute("savepoint pt;")
db.execute('INSERT INTO foo (data) values (?)', ('bah',))
db.execute('INSERT INTO foo (data) values (?)', ('goodbye world',))
db.execute("rollback to savepoint pt;")
db.execute('INSERT INTO foo (data) values (?)', ('peace',))
assert list(db.execute('select * from foo')) == [(1, 'hello'),
(2, 'world'),
(3, 'peace')]
finally:
db.close()
os.remove(f)
,使得它的工作线是db.isolation_level = None
。如果你评论它,它就像你的错误一样。我试过使用所有记录的值“延迟”,“即时”和“独占”,都以错误结束。
谢谢,消除异常处理后,我得到这个 sqlite3.OperationalError:没有这样的保存点:pt 如何打印错误,而使用异常处理程序?像python的perror()可用吗? – 2010-02-02 09:02:03
是的,有 - 但为什么?错误已经自动打印出来,只是为了打印而复制代码 – nosklo 2010-02-03 10:51:54
好吧。您是否看到上面的错误消息这里有什么问题?保存点工作正常,回滚产生错误信息。 – 2010-02-04 06:59:49
什么是例外? – 2010-02-02 08:18:54
永远不会捕获你没有处理的异常。让它升起,这样你可以得到有用的错误信息和回溯。 – nosklo 2010-02-02 08:42:47