С модулем sqlite3
для Python по умолчанию отключено по умолчанию (в соответствии с PEP 249 ):
По умолчанию модуль sqlite3 неявно открывает транзакции перед оператором языка изменения данных (DML) (т. Е. INSERT / UPDATE / DELETE / REPLACE) и неявно фиксирует транзакции перед оператором, отличным от DML, без запроса (т.SELECT или вышеупомянутое).
Если вы хотите использовать режим автоматической фиксации, то установите для изоляционного уровня значение Нет.
В противном случае оставьте его по умолчанию, что приведет к простому выражению «BEGIN», или установитеэто один из поддерживаемых уровней изоляции SQLite: «DEFERRED», «IMMEDIATE» или «EXCLUSIVE».
Вы можете проверить, что:
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()
Note. - Этот тест не будет выполнен с использованием базы данных в памяти (с аргументом ":memory:"
, переданной функции sqlite3.connect
) вместо базы данных на диске , посколькубаза данных в памяти освобождается, когдаnnection закрыто.