【问题标题】:python sqlite 3 : roll back to save point failspython sqlite 3:回滚到保存点失败
【发布时间】:2010-02-02 08:06:13
【问题描述】:
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"

在上面的代码 sn-p 中,它说“回滚到保存点失败”。 出了什么问题?

编辑: 我更改了如下所示的代码并收到错误消息

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

【问题讨论】:

  • 永远不要捕获你没有处理的异常。让它升起,这样您就可以获得有用的错误消息和回溯。
  • obj1.rollback_savepoint() 文件“open_db.py”,第 65 行,在 rollback_savepoint self.db.execute("rollback to savepoint pt;") sqlite3.OperationalError: no such savepoint:点
  • 保存点代码 sn-p 不会产生任何错误 def save(self): self.db.execute("savepoint pt;") print "Save point created"

标签: python sqlite


【解决方案1】:

永远不要捕获你没有处理的异常。让它升起,这样您就可以获得有用的错误消息和回溯。

例子:

>>> 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。如果您将其注释掉,它会像您的错误一样中断。我尝试使用所有记录在案的值“DEFERRED”、“IMMEDIATE”和“EXCLUSIVE”,都以错误结束。

【讨论】:

  • 谢谢,删除异常处理后,我得到了这个 sqlite3.OperationalError: no such savepoint: pt How to print Error ,while using exception handler ? python的perror()之类的东西可用吗??
  • 是的,有——但为什么呢?该错误已经自动打印出来了,只是为了打印而捕获它是在复制代码
  • 好的。你看到上面的错误信息了吗?这里有什么问题?保存点工作正常,回滚会产生错误消息。
  • @lakshmipathi:是的,我已经用我发现的信息编辑了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
相关资源
最近更新 更多