использовать попробовать / кроме как с 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()
метод может вызвать ошибку или нет (документация нетак сказать) так лучше, чем потом сожалеть, нет?
Какой метод выдачи запроса и управления транзакцией мне следует использовать?