#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()
Взгляните на документы для получения дополнительной информации.