gpt4 book ai didi

python - 我可以将 pymysql.connect() 与 "with"语句一起使用吗?

转载 作者:太空狗 更新时间:2023-10-29 20:42:03 25 4
gpt4 key购买 nike

下面是 pymysql 中的示例:

conn = pymysql.connect(...)
with conn.cursor() as cursor:
cursor.execute(...)
...
conn.close()

我可以改用以下方法吗,或者这会留下挥之不去的联系吗?(执行成功)

import pymysql
with pymysql.connect(...) as cursor:
cursor.execute('show tables')

(python 3,最新的pymysql)

最佳答案

这看起来不安全,如果你看here , __enter____exit__ 函数是在 with 子句中调用的。对于 pymysql 连接,它们看起来像这样:

def __enter__(self):
"""Context manager that returns a Cursor"""
return self.cursor()

def __exit__(self, exc, value, traceback):
"""On successful exit, commit. On exception, rollback"""
if exc:
self.rollback()
else:
self.commit()

所以它看起来不像是 exit 子句关闭连接,这意味着它会挥之不去。我不确定他们为什么这样做。不过,您可以制作自己的包装器来执行此操作。

您可以通过创建多个游标来回收连接 (the source for cursors is here)游标方法如下所示:

def __enter__(self):
return self

def __exit__(self, *exc_info):
del exc_info
self.close()

所以他们确实关闭了自己。您可以创建单个连接并在 with 子句中将其与多个游标一起重用。

如果你想在 with 子句后面隐藏关闭连接的逻辑,例如一个上下文管理器,一个简单的方法是这样的:

from contextlib import contextmanager
import pymysql


@contextmanager
def get_connection(*args, **kwargs):
connection = pymysql.connect(*args, **kwargs)
try:
yield connection
finally:
connection.close()

然后您可以像这样使用上下文管理器:

with get_connection(...) as con:
with con.cursor() as cursor:
cursor.execute(...)

关于python - 我可以将 pymysql.connect() 与 "with"语句一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31214658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com