Правильно ли блок with закрывает соединение psycopg2 и обрабатывает курсор при выходе?

#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? Я проверю это, как ответил впоследствии.