2011-01-15 14 views

Antwort

4

Wahrscheinlich ist autocommit auf, es ist standardmäßig http://www.sqlite.org/c3ref/get_autocommit.html

+0

Ich habe schon mit python sqlite3 herumgespielt und ich habe keine Ahnung, wie man den Code auf diesem Link funktioniert, damit ich überprüfen kann, ob auto commit auf – james

+1

@james ist, siehe http://docs.python.org/library/ sqlite3.html # sqlite3.Connection.isolation_level – ismail

+0

Es scheint merkwürdig, dass das automatische Commit standardmäßig in diesem Python * -Standard-lib * -Modul aktiviert ist, während die Python-DB-API-Spezifikation https://www.python.org/dev/peps/pep-0249/commands: "* Wenn die Datenbank eine automatische Festschreibungsfunktion unterstützt, muss diese zunächst deaktiviert sein. Eine Schnittstellenmethode kann bereitgestellt werden, um sie wieder einzuschalten. *": – kxr

1

auch Verbindungsobjekte als Kontext-Manager verwendet werden können, die automatisch Commit oder Rollback-Transaktionen. 11.13.7.3. on docs.python

# Successful, con.commit() is called automatically afterwards 
with con: 
    con.execute("insert into person(firstname) values (?)", ("Joe",)) 
+0

wäre der einzige Weg Dies kann eine Dictionary- oder Listendarstellung dieser Tabelle sein und Änderungen an der Liste vornehmen. wenn ich dann fertig bin, etwas mit einer Datenbank zu verschrauben und die Änderungen zu speichern gehe durch die Liste und setze sie in die Tabelle ein? – james

+1

@james, verwende in diesem Beispiel keinen Contextmanager wie {with con:} und setze dich selbst ein. Wenn Sie nicht mit Anweisung verwenden und Autocommit haben, siehe Navi-Antwort und Ismail-Kommentar –

2

Python sqlite3 Fragen BEGIN eine Anweisung automatisch vor "INSERT" oder "UPDATE". Danach wird es auf einem anderen Befehl oder db.close automatisch verpflichtet()

2

isolation_level=None hinzufügen zu verbinden (Ref)

db = sqlite.connect(":memory:", isolation_level=None) 
+1

Wenn "' sqlite.' 'ein Alias ​​oder ein Äquivalent für das 'sqlite3'-Modul der aktuellen Python-Standardbibliothek ist, teilt dies sqlite3 ausdrücklich mit dass der Auto-Commit-Modus aktiviert sein soll, was ohnehin der Standardwert ist.Es meldet "conn.isolation_level" als "" standardmäßig, aber auch nicht ungleich Null macht den Effekt. – kxr

1

Mit sqlite3 Modul für Python, autocommit is off by default (wie von PEP 249 erforderlich):

Standardmäßig öffnet das sqlite3-Modul Transaktionen implizit vor einer Data Modification Language (DML) -Anweisung (dh INSERT/UPDATE/DELETE/REPLACE), und Commits implizit vor einer non-DML, Nicht-Abfrage-Anweisung (i. e. alles andere als SELECT oder die zuvor genannten).

Wenn Sie den Autocommit-Modus wünschen, setzen Sie isolation_level auf None.

lassen Sie es sonst in ihrem Standard, die in einer einfachen „BEGIN“ Anweisung zur Folge haben wird, oder an einen der unterstützten Isolierung Ebenen des SQLite gesetzt: „deferred“, „SOFORT“ oder „exklusiv“.

Sie können das überprüfen:

import sqlite3 

# non-autocommit mode (default) 
connection = sqlite3.connect("test.db") 
cursor = connection.cursor() 
cursor.execute("CREATE TABLE IF NOT EXISTS t (i INT)") 
cursor.execute("INSERT INTO t VALUES (?)", (5,)) 
cursor.close() 
connection.close() 
connection = sqlite3.connect("test.db") 
cursor = connection.cursor() 
cursor.execute("SELECT * FROM t") 
assert cursor.fetchall() == [] 
cursor.close() 
connection.close() 

# autocommit mode 
connection = sqlite3.connect("test.db", isolation_level=None) 
cursor = connection.cursor() 
cursor.execute("CREATE TABLE IF NOT EXISTS t (i INT)") 
cursor.execute("INSERT INTO t VALUES (?)", (5,)) 
cursor.close() 
connection.close() 
connection = sqlite3.connect("test.db", isolation_level=None) 
cursor = connection.cursor() 
cursor.execute("SELECT * FROM t") 
assert cursor.fetchall() == [(5,)] 
cursor.close() 
connection.close() 

Hinweis. - Sie können den gleichen Test nicht mit einer In-Memory-Datenbank (mit dem ersten Parameter der Verbindungsfunktion ":memory:") anstelle einer Datenbank ausführen, da eine In-Memory-Datenbank freigegeben wird, wenn die Verbindung geschlossen wird.