2010-01-10 33 views
5

Tôi đang cố gắng sử dụng các điểm lưu trữ với mô-đun sqlite3 được tích hợp vào trăn 2.6. Mỗi khi tôi cố gắng phát hành hoặc khôi phục một điểm lưu trữ, tôi luôn nhận được OperationalError: no such savepoint. Tôi đang thiếu gì?Sử dụng các điểm lưu trong python sqlite3

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 

từ mã này:

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

Related: http://stackoverflow.com/questions/1654857/ –

Trả lời

3

này dường như là một kết quả của việc các module sqlite3 cư xử với mức độ cách ly.

này hoạt động, chú ý đến hai thay đổi:

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 

Đây là một câu trả lời thỏa đáng, và tôi không thấy bất cứ điều gì có liên quan trong các tài liệu mô-đun sqlite3 (cũng không Tôi cố gắng xem xét nguồn gốc). Nhưng tôi hy vọng nó sẽ giúp bạn tìm đúng hướng.

+0

Tôi chưa bao giờ xem xét thử nó mà không có bất kỳ cấp độ giao dịch bên ngoài nào, vì các tài liệu SQL chỉ ra rằng các điểm lưu trữ có thể được sử dụng kết hợp với các giao dịch. Điều này gợi ý với tôi rằng có lẽ tôi cần một bản pragma nhất định để làm cho nó hoạt động cùng nhau! Cảm ơn đã cho tôi một hướng tốt để điều tra thêm .. –

Các vấn đề liên quan