2010-01-10 14 views
5

Estoy intentando utilizar puntos de guardado con el módulo sqlite3 integrado en python 2.6. Cada vez que trato de liberar o deshacer un savepoint, siempre recibo un OperationalError: no such savepoint. ¿Qué me estoy perdiendo?Uso de puntos de guardado en 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 

de este código:

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

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

Respuesta

3

Esto parece ser el resultado de cómo se comporta el módulo del sqlite3 con ese nivel de aislamiento.

Esto funciona, observe los dos cambios:

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

Salida:

 
$ 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 

Ésta es una respuesta insatisfactoria, y no vi nada relevante en la documentación del módulo del sqlite3 (ni tampoco Intento echar un vistazo a la fuente). Pero espero que te ayude a encontrar la dirección correcta.

+0

Nunca consideré intentarlo sin ningún nivel de transacción externo, ya que los documentos de SQL indicaban que los puntos de guardado se pueden usar junto con las transacciones. Esto me insinúa que tal vez necesito un cierto pragma para hacer que todo funcione en conjunto. Gracias por darme una buena dirección para más investigación .. –

Cuestiones relacionadas