【问题标题】:Using savepoints in python sqlite3在 python sqlite3 中使用保存点
【发布时间】:2011-01-03 10:18:56
【问题描述】:

我正在尝试将保存点与 python 2.6 中内置的 sqlite3 模块一起使用。每次我尝试释放或回滚保存点时,我总是收到OperationalError: no such savepoint。我错过了什么?

python version: 2.6.4 (r264:75821M, Oct 27 2009, 19:48:32) 
[GCC 4.0.1 (Apple Inc. build 5493)]
PySQLite version: 2.4.1
sqlite3 version: 3.6.11

Traceback (most recent call last):
  File "spDemo.py", line 21, in <module>
    conn.execute("release savepoint spTest;")
sqlite3.OperationalError: no such savepoint: spTest

从此代码:

import sys
import sqlite3

print 'python version:', sys.version
print 'PySQLite version:', sqlite3.version
print 'sqlite3 version:', sqlite3.sqlite_version
print

conn = sqlite3.connect('db_spDemo.db')
conn.isolation_level = "DEFERRED"

with conn:
    conn.execute("create table example (A, B);")

with conn:
    conn.execute("insert into example values (?, ?);", (0,200))

    conn.execute("savepoint spTest;")
    conn.execute("insert into example values (?, ?);", (1,201))
    conn.execute("insert into example values (?, ?);", (2,202))
    conn.execute("release savepoint spTest;")

    conn.execute("insert into example values (?, ?);", (5,205))

【问题讨论】:

标签: python sqlite savepoints


【解决方案1】:

这似乎是 sqlite3 模块在该隔离级别下表现的结果。

这可行,注意两个变化:

import sys
import sqlite3

print 'python version:', sys.version
print 'PySQLite version:', sqlite3.version
print 'sqlite3 version:', sqlite3.sqlite_version
print

conn = sqlite3.connect('shane.sqlite')
conn.isolation_level = None  # CHANGED

with conn:
    conn.execute("create table example (A, B);")

with conn:
    conn.execute("insert into example values (?, ?);", (0,200))

    conn.execute("savepoint spTest;")
    conn.execute("insert into example values (?, ?);", (1,201))
    conn.execute("insert into example values (?, ?);", (2,202))
    conn.execute("rollback to savepoint spTest;")  # CHANGED

    conn.execute("insert into example values (?, ?);", (5,205))

输出:

$ python shane-sqlite3.py && sqlite3 shane.sqlite '从示例中选择 *;' python 版本:2.6.2(release26-maint,2009 年 4 月 19 日,01:56:41) [GCC 4.3.3] PySQLite 版本:2.4.1 sqlite3 版本:3.6.10 0|200 5|205

这是一个不令人满意的答案,我在 sqlite3 模块文档中没有看到任何相关内容(我也没有尝试查看源代码)。但我希望它能帮助你找到正确的方向。

【讨论】:

  • 我从来没有考虑在没有任何外部事务级别的情况下尝试它,因为 SQL 文档表明保存点可以与事务一起使用。这向我暗示,也许我需要某种 pragma 才能使它们一起工作!感谢您为我提供更多调查的好方向..
【解决方案2】:

这是 pysqlite 中的一个错误,请参阅 the pysql issue trackerthe python issue tracker

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2021-12-22
    • 2021-09-14
    • 2013-11-13
    • 2020-03-31
    • 2020-12-02
    相关资源
    最近更新 更多