sqlite3 сохранение изменений без команды коммита в python - PullRequest
5 голосов
/ 15 января 2011

Я где-то читал, чтобы сохранить данные в базу данных sqlite3 на python, которую вы вызываете функцией commit () для объекта соединенияя никогда не делаю этого, но моя база данных по-прежнему получает данные, сохраненные в ней ... почему?

Ответы [ 5 ]

5 голосов
/ 23 января 2018

С модулем 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 закрыто.

4 голосов
/ 15 января 2011

Возможно автокоммит включен, по умолчанию http://www.sqlite.org/c3ref/get_autocommit.html

3 голосов
/ 12 апреля 2013

Python sqlite3 автоматически выполняет оператор BEGIN перед «INSERT» или «UPDATE».После этого он автоматически фиксирует любую другую команду или db.close ()

2 голосов
/ 13 мая 2014

Добавить isolation_level=None для подключения ( Ссылка )

db = sqlite.connect(":memory:", isolation_level=None)
1 голос
/ 15 января 2011

также объекты соединения могут использоваться как контекстные менеджеры, которые автоматически фиксируют или откатывают транзакции. 11.13.7.3.на docs.python

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