[Python] use try/except with psycopg2 or "with closing"?

Discussão em 'Python' iniciado por Stack, Março 28, 2025.

  1. Stack

    Stack Membro Participativo

    I'm using Psycopg2 in Python to access a PostgreSQL database. I'm curious if it's safe to use the with closing() pattern to create and use a cursor, or if I should use an explicit try/except wrapped around the query. My question is concerning inserting or updating, and transactions.

    As I understand it, all Psycopg2 queries occur within a transaction, and it's up to calling code to commit or rollback the transaction. If within a with closing(... block an error occurs, is a rollback issued? In older versions of Psycopg2, a rollback was explicitly issued on close() but this is not the case anymore (see https://www.psycopg.org/docs/connection.html#connection.close).

    My question might make more sense with an example. Here's an example using 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()


    What happens when module.raise_unexpected_error() raises its error? Is the transaction rolled back? As I understand transactions, I either need to commit them or roll them back. So in this case, what happens?

    Alternately I could write my query like this:

    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()


    Also I should mention that I have no idea if Psycopg2's connection class cursor() method could raise an error or not (the documentation doesn't say) so better safe than sorry, no?

    Which method of issuing a query and managing a transaction should I use?

    Continue reading...

Compartilhe esta Página