Frage

Ich versuche, SavePoints mit dem in Python 2.6 eingebauten SQLite3 -Modul zu verwenden. Jedes Mal, wenn ich versuche, einen Savepoint zu veröffentlichen oder zu rollen, erhalte ich immer eine OperationalError: no such savepoint. Was vermisse ich?

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

Aus diesem 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))
War es hilfreich?

Lösung

Dies scheint ein Ergebnis zu sein, wie sich das SQLite3 -Modul mit dieser Isolationsstufe verhält.

Dies funktioniert, bemerken Sie die beiden Änderungen:

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

Ausgabe:

$ 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

Dies ist eine unbefriedigende Antwort, und ich habe in den SQLite3 -Moduldocs nichts Relevantes gesehen (ich habe auch nicht versucht, einen Blick auf die Quelle zu werfen). Aber ich hoffe es hilft Ihnen, die richtige Richtung zu finden.

Andere Tipps

Dies ist ein Fehler in Pysqlite, siehe Der PYSQL -Ausgabe -Tracker und Der Python -Ausgabe -Tracker.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top