#python #postgresql #psycopg2
#питон #postgresql #psycopg2
Вопрос:
Рассмотрим следующие 2 подхода:
Закрытие вручную
import psycopg2
conn = psycopg2.connect('dbname=foo')
csor = conn.cursor()
csor.execute(qry)
conn.commit()
csor.close()
conn.close()
С помощью блока
with psycopg2.connect('dbname=foo') as conn:
with conn.cursor() as csor:
csor.execute(qry)
conn.commit()
Мой вопрос в том, эквивалентны ли эти 2 подхода друг другу? Я обеспокоен тем, что with
блок может уничтожить ссылки на переменные, но оставить соединения открытыми. Однако я не думаю, что это так, основываясь на некоторых тестах, которые я провел. Тем не менее, будет здорово, если кто-то с большим опытом работы с ними поможет подтвердить мое понимание. Спасибо!
Ответ №1:
Это объясняется в документации:
Когда соединение выходит из блока with, если блок не вызвал исключения, транзакция фиксируется. В случае исключения транзакция откатывается
[…]
Соединение может использоваться не только в операторе with, и каждый блок with эффективно упаковывается в отдельную транзакцию
Таким образом, никакие ссылки не уничтожаются, и соединение не закрывается, но фиксация выполняется.
Комментарии:
1. Привет, спасибо за быстрый ответ! Я определенно не сталкивался с этим разделом в документации, когда я просматривал ранее. Не могли бы вы также добавить в свой ответ, что курсор закрывается при выходе из внутреннего блока with? Я проверю это, как ответил впоследствии.