Правильно ли закрывает блок with соединение psycopg2 и курсор при выходе? - PullRequest
0 голосов
/ 15 апреля 2019

Рассмотрим следующие 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()

У меня вопрос, эти два подхода эквивалентны друг другу? Я обеспокоен тем, что блок with может уничтожить ссылки на переменные, но оставить соединения открытыми. Я не думаю, что это так, основываясь на некоторых тестах, которые я провел. Тем не менее, было бы здорово, если кто-то с большим опытом в этом поможет подтвердить мое понимание. Спасибо!

1 Ответ

1 голос
/ 15 апреля 2019

Это объясняется в документации :

Когда соединение выходит из блока with, если блок не вызвал никаких исключений, транзакция фиксируется.В случае исключения транзакция откатывается

[...]

Соединение может использоваться более чем в операторе with, и каждое с блоком эффективно упаковывается в отдельную транзакцию

Итак, никакие ссылки не уничтожены и никакое соединение не закрыто, но фиксация выполнена.

...