Использование диспетчера контекста с psycopg2

#python #psycopg2

#python #psycopg2

Вопрос:

У меня есть инструкция update, как показано ниже:

   with conn.cursor() as cursor:
        LOGGER.info('Batch updating for issues which neeeds to be closed......')
        create_temp_table(conn, 'temp_closed_issues')
        copy_from_stringio(conn, close_df, table='temp_closed_issues')
        query = """
            WITH update_cte as (
            SELECT issue_id, device_id, 
            daterange(start_date, end_date) as new_issue_date
            FROM temp_closed_issues
            )
            UPDATE {table} 
            SET issue_date = update_cte.new_issue_date
            FROM update_cte
            WHERE update_cte.issue_id = {table}.issue_id
            AND update_cte.device_id = {table}.device_id
            AND lower(update_cte.new_issue_date) = lower({table}.issue_date)         
            """.format(table=table)
        cursor.execute(query)
        LOGGER.info("updated records: %s", cursor.rowcount)
  

Я пытаюсь понять поведение использования курсора в качестве диспетчера контекста. Я понимаю, что в приведенном выше блоке при выходе из блока С закрытым курсором. Если возникает исключение, выполняется ли автоматический откат транзакции или нам нужно вызвать исключение. Более того, записи передаются в базу данных без явного использования cursor.commit()

Ответ №1:

Записи фиксируются или откатываются автоматически, только когда вы используете диспетчер контекста для соединения, потому что commit() / rollback() — это методы соединения.

 SQL = "INSERT INTO ..."
# The context manager commits when no exception was raised, else wise roll back!
with psycopg2.connect(DSN) as conn:
    with conn.cursor() as curs:
        curs.execute(SQL, ('val_1', 'val_2', ...))
  

Соединение без контекста:

 conn = psycopg2.connect(DSN)
with conn.cursor() as curs:
    curs.execute(SQL, ('val_1', 'val_2', ...))
    # You need to commit/roll back manually 
    # conn.commit()
  

Взгляните на документы для получения дополнительной информации.