Python で Psycopg2 を使用して 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()
メソッドがエラーを発生させる可能性があるかどうかはわかりません (ドキュメントには記載されていません)。
クエリを発行してトランザクションを管理するには、どの方法を使用すればよいですか?