【问题标题】:Does the with block close the psycopg2 connection and cursor handle properly upon exit?with 块是否在退出时正确关闭 psycopg2 连接和光标句柄?
【发布时间】:2019-04-15 15:55:23
【问题描述】:

考虑以下两种方法:

手动关闭

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 块可能会破坏对变量的引用但保持连接打开。根据我运行的一些测试,我认为情况并非如此。但是,如果有更多经验的人帮助确认我的理解,那就太好了。谢谢!

【问题讨论】:

    标签: python postgresql psycopg2


    【解决方案1】:

    这在documentation中有解释:

    当连接退出 with 块时,如果没有出现异常 由块引发,事务被提交。的情况下 事务回滚异常

    [...]

    一个连接可以用在多个 with 语句中,并且每个 with 区块被有效地包装在一个单独的事务中

    所以,没有引用被破坏,也没有关闭连接,但是提交完成了。

    【讨论】:

    • 您好,感谢您的快速回答!当我早些时候环顾四周时,我绝对没有在文档中遇到该部分。您能否在您的回答中添加 cursor 在内部 with 块退出时关闭?之后我会检查它的回答。
    猜你喜欢
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    相关资源
    最近更新 更多