Почему соединение в DB-API Python не имеет операции “начать”?
-
23-09-2019 - |
Вопрос
Работая с курсорами в mysql-python, я использовал для вызова "BEGIN;", "COMMIT;" и "ROLLBACK;" явно следующим образом:
try:
cursor.execute("BEGIN;")
# some statements
cursor.execute("COMMIT;")
except:
cursor.execute("ROLLBACK;")
затем я обнаружил, что базовый объект connection имеет соответствующие методы:
try:
cursor.connection.begin()
# some statements
cursor.connection.commit()
except:
cursor.connection.rollback()
Осматривая ОПТОСОЗ DB-API Я обнаружил, что в нем не упоминается метод begin() для объекта connection, даже для расширений.
Mysql-python, кстати, выдает предупреждение об устаревании, когда вы используете этот метод.sqlite3.connection, например, вообще не имеет этого метода.
И вопрос в том, почему такого метода нет в PEP?Является ли это утверждение каким-то необязательным, достаточно ли вместо этого вызвать commit()?
Решение 2
Решил ответить сам:
A тема о транзакциях DB API 2.0 в python-list и следующий отрывок из заметной книги SQL Полная ссылка заставь меня думать, что DB API реализует стандартное поведение SQL1:
Первая версия стандарта SQL (SQL1) определяла неявную транзакцию режим, основанный на транзакции поддержка в ранних выпусках DB2.В неявном режиме поддерживаются только инструкции COMMIT и ROLLBACK.A Транзакция SQL автоматически начинается с первой инструкции SQL, выполняемой пользователем или программой, и заканчивается, когда выполняется ФИКСАЦИЯ или ОТКАТ. Завершение одной транзакции неявно запускает новую.
Режим явной транзакции (SQL2 и SQL: 1999) кажется удобным, когда RDBSM поддерживает режим автоматической фиксации и текущее соединение находится в этом режиме, но DB API просто не отражает его.
Другие советы
смотри ответ на этот ранее заданный вопрос.Как правило, "протокол" для использования с транзакциями является:
cursor = conn.cursor()
try:
cursor.execute(...)
except DatabaseError:
conn.rollback()
raise
else:
conn.commit()
finally:
cursor.close()
Начиная с python 2.6 базы данных SQLite Connection
объекты могут использоваться в качестве контекстных менеджеров, которые автоматически фиксируют или откатывают транзакции.