Почему соединение в DB-API Python не имеет операции “начать”?

StackOverflow https://stackoverflow.com/questions/2546926

  •  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 объекты могут использоваться в качестве контекстных менеджеров, которые автоматически фиксируют или откатывают транзакции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top