在 python sqlite3 中使用保存点 [英] Using savepoints in python sqlite3

查看:54
本文介绍了在 python sqlite3 中使用保存点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

python 版本:2.6.4 (r264:75821M, Oct 27 2009, 19:48:32)[GCC 4.0.1 (Apple Inc. build 5493)]PySQLite 版本:2.4.1sqlite3 版本:3.6.11回溯(最近一次调用最后一次): 中的文件spDemo.py",第 21 行conn.execute("释放保存点 spTest;")sqlite3.OperationalError:没有这样的保存点:spTest

来自此代码:

导入系统导入 sqlite3打印 'python 版本:', sys.version打印 'PySQLite 版本:', sqlite3.version打印 'sqlite3 版本:', sqlite3.sqlite_version打印conn = sqlite3.connect('db_spDemo.db')conn.isolation_level = "延迟"与连接:conn.execute("创建表示例(A,B);")与连接:conn.execute("插入示例值 (?, ?);", (0,200))conn.execute("savepoint spTest;")conn.execute("插入示例值(?, ?);", (1,201))conn.execute("插入示例值(?, ?);", (2,202))conn.execute("释放保存点 spTest;")conn.execute("插入示例值(?, ?);", (5,205))

解决方案

这似乎是 sqlite3 模块在该隔离级别下的行为的结果.

这是有效的,注意两个变化:

导入系统导入 sqlite3打印 'python 版本:', sys.version打印 'PySQLite 版本:', sqlite3.version打印 'sqlite3 版本:', sqlite3.sqlite_version打印conn = sqlite3.connect('shane.sqlite')conn.isolation_level = None # CHANGED与连接:conn.execute("创建表示例(A,B);")与连接:conn.execute("插入示例值 (?, ?);", (0,200))conn.execute("savepoint spTest;")conn.execute("插入示例值(?, ?);", (1,201))conn.execute("插入示例值(?, ?);", (2,202))conn.execute("rollback to savepoint spTest;") # CHANGEDconn.execute("插入示例值(?, ?);", (5,205))

输出:

<前>$ python shane-sqlite3.py && sqlite3 shane.sqlite 'select * from example;'python 版本:2.6.2(release26-maint,2009 年 4 月 19 日,01:56:41)[海湾合作委员会 4.3.3]PySQLite 版本:2.4.1sqlite3 版本:3.6.100|2005|205

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

I'm attempting to use savepoints with the sqlite3 module built into python 2.6. Every time I try to release or rollback a savepoint, I always recieve an OperationalError: no such savepoint. What am I missing?

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

from this code:

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))

解决方案

This appears to be a result of how the sqlite3 module behaves with that isolation level.

This works, notice the two changes:

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))

Output:

$ python shane-sqlite3.py && sqlite3 shane.sqlite 'select * from example;'
python version: 2.6.2 (release26-maint, Apr 19 2009, 01:56:41) 
[GCC 4.3.3]
PySQLite version: 2.4.1
sqlite3 version: 3.6.10

0|200
5|205

This is an unsatisfactory answer, and I didn't see anything relevant in the sqlite3 module docs (nor did I try to take a look at the source). But I hope it helps you find the right direction.

这篇关于在 python sqlite3 中使用保存点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆