Базовая библиотека sqlite3 по умолчанию работает в режиме автоматической фиксации, а модуль sqlite3
в Python по умолчанию - нет.
Режим autocommit
означает, что операторы, которые изменяют базу данных, вступают в силу немедленно. Оператор BEGIN
или SAVEPOINT
отключает режим автоматической фиксации autocommit
, а команда COMMIT
, ROLLBACK
или RELEASE
, которая завершает внешнюю транзакцию, снова включает режим автоматической фиксации.
autocommit
.Новое в Python 3.12.
C версии Python 3.12. рекомендуемый способ управления поведением транзакции - через атрибут Connection.autocommit
, который предпочтительно следует устанавливать с помощью параметра .autocommit
функции sqlite3.connect()
.
Предлагается установить значение Connection.autocommit
равным False
, что подразумевает управление транзакциями, совместимое с PEP 249. Это означает:
sqlite3
гарантирует, что транзакция всегда открыта, поэтому sqlite3.connect()
, Connection.commit()
и Connection.rollback()
неявно откроют новую транзакцию (сразу после закрытия ожидающей, для последних двух). Модуль sqlite3
использует отложенные инструкции BEGIN
при открытии транзакций.Connection.commit()
.Connection.rollback()
.Connection.close()
с ожидающими изменениями.При установке для Connection.autocommit
значение True
, включается режим автоматической фиксации БД SQLite. В этом режиме Connection.commit()
и Connection.rollback()
не имеют никакого эффекта. Обратите внимание, что режим автоматической фиксации SQLite отличается от атрибута Connection.autocommit
, совместимого с PEP 249. Для запроса низкоуровневого режима автоматической фиксации SQLite необходимо использовать Connection.in_transaction
.
При установке для Connection.autocommit
значение sqlite3.LEGACY_TRANSACTION_CONTROL
, останавливает поведение управления транзакцией атрибуту Connection.isolation_level
. Дополнительные сведения смотрите в следующем разделе.
isolation_level
Если для Connection.autocommit
установлено значение sqlite3.LEGACY_TRANSACTION_CONTROL
(по умолчанию), то поведение транзакции контролируется с помощью атрибута Connection.isolation_level
. В противном случае уровень изоляции не имеет никакого эффекта.
Контроль транзакций до версии Python 3.12.
Модуль sqlite3
в Python по умолчанию выдает оператор BEGIN
неявно перед оператором языка DML - модификации данных, т. е. INSERT
/UPDATE
/DELETE
/REPLACE
.
Описанное поведение можно контролировать, какой тип операторов BEGIN
sqlite3 выполняется неявно, с помощью параметра isolation_level
в вызове функции sqlite3.connect()
или с помощью свойства соединений connection.isolation_level
. Если не указать isolation_level
, то будет используется простой BEGIN
, что эквивалентно указанию isolation_level=DEFERRED
. Другие возможные значения являются IMMEDIATE
и EXCLUSIVE
.
Можно отключить неявное управление транзакциями в модуле sqlite3
, установив значение уровня изоляции на None
. Это заставит базовую библиотеку sqlite3
работать в режиме автоматической фиксации. После этих действий можно полностью контролировать состояние транзакции, явно выполняя в своем SQL коде операторы BEGIN
, ROLLBACK
, SAVEPOINT
и RELEASE
.
Проще говоря, что бы включить autocommit
необходимо соединяться с базой данных SQLite3 следующим образом.
import sqlite3 connect = sqlite3.connect(path_db) # эта строка включает autocommit connect.isolation_level = None with connect: try: cur = connect.execute('INSERT/UPDATE ....') except sqlite3.Error as e: print(e) print(cur.lastrowid)