sqlite3 guardando cambios sin el comando commit en python

Leí en algún lugar para guardar datos en una base de datos sqlite3 en Python. Debes llamar a la función commit () en el objeto de conexión. Nunca hago esto, pero mi base de datos aún tiene los datos guardados en él … ¿por qué?

Con el módulo sqlite3 para Python, autocommit está desactivado por defecto (como lo requiere PEP 249 ):

Por defecto, el módulo sqlite3 abre transacciones implícitamente antes de una statement del lenguaje de modificación de datos (DML) (es decir, INSERT / UPDATE / DELETE / REPLACE), y confirma transacciones implícitamente antes de una statement que no es de DML, no consulta (es decir, cualquier otra cosa que no sea SELECT o lo antes mencionado).

Si desea el modo de confirmación automática, configure el nivel de aislamiento en Ninguno.

De lo contrario, déjelo en su valor predeterminado, lo que resultará en una simple statement de “COMIENZO”, o la configurará en uno de los niveles de aislamiento soportados por SQLite: “DEFERIDO”, “INMEDIATO” o “EXCLUSIVO”.

Puedes comprobar que:

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

Nota. – Esta prueba fallará al usar una base de datos en memoria (con el argumento ":memory:" pasado a la función sqlite3.connect ) en lugar de una base de datos en disco , ya que una base de datos en memoria se libera cuando se cierra la conexión.

Probablemente está activada la función de confirmación automática, está por defecto en http://www.sqlite.org/c3ref/get_autocommit.html

Python sqlite3 emite una instrucción BEGIN automáticamente antes de “INSERT” o “UPDATE”. Después de eso, se ejecuta automáticamente en cualquier otro comando o db.close ()

Añadir isolation_level=None para conectar ( Ref )

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

también los objetos de conexión se pueden usar como administradores de contexto que automáticamente confirman o retrotraen transacciones. 11.13.7.3. en docs.python

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