2010-02-02 61 views
1
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 
+0

什么是例外? – 2010-02-02 08:18:54

+0

永远不会捕获你没有处理的异常。让它升起,这样你可以得到有用的错误信息和回溯。 – nosklo 2010-02-02 08:42:47

+0

obj1.rollback_savepoint() 文件 “open_db.py”,第65行,在rollback_savepoint self.db.execute( “回滚到保存点PT;”) sqlite3.OperationalError:没有这样的保存点:PT – 2010-02-02 09:02:20

回答

4

千万不要赶你不处理异常。让它升起,这样你可以得到有用的错误信息和回溯。

例子:

>>> 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。如果你评论它,它就像你的错误一样。我试过使用所有记录的值“延迟”,“即时”和“独占”,都以错误结束。

+0

谢谢,消除异常处理后,我得到这个 sqlite3.OperationalError:没有这样的保存点:pt 如何打印错误,而使用异常处理程序?像python的perror()可用吗? – 2010-02-02 09:02:03

+0

是的,有 - 但为什么?错误已经自动打印出来,只是为了打印而复制代码 – nosklo 2010-02-03 10:51:54

+0

好吧。您是否看到上面的错误消息这里有什么问题?保存点工作正常,回滚产生错误信息。 – 2010-02-04 06:59:49