использовать попробовать / кроме как с psycopg2 или «с закрытием»?

Я использую Psycopg2 в Python для доступа к базе данных PostgreSQL. Мне любопытно, безопасно ли использоватьwith closing() шаблон для создания и использования курсора, или если я должен использовать явныйtry/except обернутый вокруг запроса. Мой вопрос касается вставки или обновления и транзакций.

Насколько я понимаю, все запросы Psycopg2 происходят внутри транзакции, и это зависит от вызова кода для фиксации или отката транзакции. Если в пределахwith closing(... заблокировать ошибку, выдан ли откат? В старых версиях Psycopg2 откат был явноclose() но это уже не так (см.http://initd.org/psycopg/docs/connection.html#connection.close).

Мой вопрос может иметь больше смысла с примером. Вот пример использованияwith closing(...

with closing(db.cursor()) as cursor:
     cursor.execute("""UPDATE users                    
             SET password = %s, salt = %s
             WHERE user_id = %s""",
             (pw_tuple[0], pw_tuple[1], user_id))
     module.rase_unexpected_error()
     cursor.commit()

Что происходит, когда module.raise_unexpected_error () вызывает ошибку? Откатывается ли транзакция? Как я понимаю транзакции, мне нужно либо зафиксировать их, либо откатить назад. Так что в этом случае, что происходит?

Поочередно я мог бы написать свой запрос так:

cursor = None
try:
    cursor = db.cursor()
    cursor.execute("""UPDATE users                    
            SET password = %s, salt = %s
            WHERE user_id = %s""",
            (pw_tuple[0], pw_tuple[1], user_id))
    module.rase_unexpected_error()
    cursor.commit()
except BaseException:
    if cursor is not None:
        cursor.rollback()
finally:
    if cursor is not None:
        cursor.close()

Также я должен упомянуть, что понятия не имею, имеет ли класс соединения Psycopg2cursor() метод может вызвать ошибку или нет (в документации не сказано), так что лучше, чем потом сожалеть, нет?

Какой метод выдачи запроса и управления транзакцией мне следует использовать?

Ответы на вопрос(1)

Ваш ответ на вопрос