использовать попробовать / кроме как с 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()

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

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

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

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