Почему соединение в DB-API Python не имеет операции «начало»? - PullRequest
8 голосов
/ 30 марта 2010

Работая с курсорами в mysql-python, я использовал для вызова «BEGIN;», «COMMIT;» и «ROLLBACK;» явно следующим образом:

try:
    cursor.execute("BEGIN;")
    # some statements
    cursor.execute("COMMIT;")
except:
    cursor.execute("ROLLBACK;")

затем я обнаружил, что базовый объект соединения имеет соответствующие методы:

try:
    cursor.connection.begin()
    # some statements
    cursor.connection.commit()
except:
    cursor.connection.rollback()

Проверка DB-API PEP Я обнаружил, что в нем не упоминается метод begin () для объекта подключения, даже для расширений.

Mysql-python, кстати, выдает DeprecationWarning, когда вы используете метод. Например, sqlite3.connection не имеет метода вообще.

И вопрос в том, почему в PEP такого метода нет? Является ли оператор каким-то необязательным, достаточно ли вместо этого вызывать commit ()?

Ответы [ 2 ]

7 голосов
/ 30 марта 2010

look a ранее заданный вопрос . Обычно «протокол» для использования с транзакциями:

cursor = conn.cursor()
try:
    cursor.execute(...)
except DatabaseError:
    conn.rollback()
    raise
else:
    conn.commit()
finally:
    cursor.close()

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

4 голосов
/ 07 мая 2010

Решила ответить сама:

A поток о транзакциях API БД 2.0 в списке python и следующий отрывок из заметной книги Полный справочник по SQL заставляет меня думать, что DB API реализует стандартное поведение SQL1:

Первая версия стандарта SQL (SQL1) определил неявную транзакцию режим, основанный на сделке поддержка в ранних выпусках DB2. В неявном режиме только COMMIT и ROLLBACK операторы поддерживаются. Транзакция SQL начинается автоматически с первым выполненным оператором SQL пользователем или программой и заканчивается, когда COMMIT или ROLLBACK выполняется. окончание одной транзакции неявно начинает новый.

Явный режим транзакций (SQL2 и SQL: 1999) представляется полезным, когда RDBSM поддерживает режим автоматической фиксации, и текущее соединение находится в этом режиме, но DB API просто не отражает его.

...