gpt4 book ai didi

python - 如何在 sqlalchemy 中正确关闭 mysql 连接?

转载 作者:太空狗 更新时间:2023-10-29 20:23:37 27 4
gpt4 key购买 nike

我想知道在 sqlalchemy 中关闭所有 mysql 连接的正确方法是什么。对于上下文,它是一个 Flask 应用程序,所有 View 共享相同的 session 对象。

engine = create_engine("mysql+pymysql://root:root@127.0.0.1/my_database")

make_session = sessionmaker(bind=engine, autocommit=False)

session = ScopedSession(make_session)()

当应用程序被拆除时,session 关闭并且 engine 被释放

session.close()
engine.dispose()

但是根据数据库日志,我仍然有很多错误,例如 [Warning] Aborted connection 940 to db: 'master' user: 'root' host: '172.19.0.7' (Got an error reading communication数据包)

我尝试了一些解决方案,包括调用 gc.collect()engine.pool.dispose() 但没有成功......

我怀疑后台引擎仍然打开了一些连接,需要关闭它们。有没有列出引擎打开的所有 session /连接?

在这上面花了很多时间之后,任何建议/帮助/指针将不胜感激!谢谢。

P.S:disposeclose 调用的灵感来自 How to close sqlalchemy connection in MySQL .顺便说一句,什么是“ checkout ”连接?

最佳答案

这可能无法完全回答您的问题,但我一直在使用这种方法来确保我的所有 session 都已关闭。每个使用 session 的函数都会得到 provide_session 装饰器。请注意必须存在 session=None 参数。

例如

@provide_session()
def my_func(session=None):
do some stuff
session.commit()

我在 Incubator-Airflow 项目中看到它的使用,非常喜欢它。

import contextlib
from functools import wraps

...
Session = ScopedSession(make_session)

@contextlib.contextmanager
def create_session():
"""
Contextmanager that will create and teardown a session.
"""
session = Session()
try:
yield session
session.expunge_all()
session.commit()
except:
session.rollback()
raise
finally:
session.close()


def provide_session(func):
"""
Function decorator that provides a session if it isn't provided.
If you want to reuse a session or run the function as part of a
database transaction, you pass it to the function, if not this wrapper
will create one and close it for you.
"""
@wraps(func)
def wrapper(*args, **kwargs):
arg_session = 'session'

func_params = func.__code__.co_varnames
session_in_args = arg_session in func_params and \
func_params.index(arg_session) < len(args)
session_in_kwargs = arg_session in kwargs

if session_in_kwargs or session_in_args:
return func(*args, **kwargs)
else:
with create_session() as session:
kwargs[arg_session] = session
return func(*args, **kwargs)

return wrapper

关于python - 如何在 sqlalchemy 中正确关闭 mysql 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48213032/

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