2010-01-10 34 views
5

Kaydetme noktalarını python 2.6'da yerleşik sqlite3 modülü ile kullanmaya çalışıyorum. Her zaman bir kaydetme noktasını serbest bırakmaya veya geri almayı denediğimde, her zaman bir OperationalError: no such savepoint aldım. Neyi kaçırıyorum? Bu koddan Kaydetme noktalarını python sqlite3'te kullanma

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

İlgili: http://stackoverflow.com/questions/1654857/ –

cevap

3

Bu Sqlite3 modülü o izolasyon seviyesi ile nasıl davranacağını bir sonucu olarak görünmektedir. Bu işleri

, iki değişiklik fark:

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

Çıktı:

 
$ 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 

Bu tatmin edici olmayan bir cevap olduğunu ve Sqlite3 modülü dokümanlarında ilgili bir şey görmedim (ne de yaptılar Kaynağa bakmaya çalışıyorum). Ama umarım doğru yönü bulmanıza yardımcı olur.

+0

SQL docs, kaydetme noktalarının işlemlerle birlikte kullanılabileceğini belirttiğinden, hiçbir dış işlem düzeyi olmadan denemeyi hiç düşünmedim. Bu, bana hep birlikte çalışmasını sağlamak için belki de belirli bir pragmaya ihtiyacım var. Daha fazla soruşturma için bana iyi bir yol verdiğiniz için teşekkürler. –

İlgili konular