gpt4 book ai didi

python - SQLAlchemy session 和连接关系

转载 作者:行者123 更新时间:2023-11-29 01:53:19 27 4
gpt4 key购买 nike

使用相同的 SQLAlchemy session 对象执行的查询是否使用相同的底层连接?如果没有,是否有办法确保这一点?

一些背景:我需要使用 MySQL 的命名锁功能,即 GET_LOCK()RELEASE_LOCK() 函数。就 MySQL 服务器而言,只有获得锁的连接才能释放它 - 所以我必须确保我要么在同一个连接中执行这两个命令,要么连接终止以确保锁被释放。

为了让事情变得更好,我创建了一个“锁定”的上下文,如下所示:

@contextmanager
def mysql_named_lock(session, name, timeout):
"""Get a named mysql lock on a session
"""
lock = session.execute("SELECT GET_LOCK(:name, :timeout)",
name=name, timeout=timeout).scalar()
if lock:
try:
yield session
finally:
session.execute("SELECT RELEASE_LOCK(:name)", name=name)
else:
e = "Count not obtain named lock {} within {} sections".format(
name, timeout)
raise RuntimeError(e)

def my_critical_section(session):
with mysql_named_lock(session, __name__, 10) as lockedsession:
thing = lockedsession.query(MyStuff).one()
return thing

我想确保 mysql_named_lock 中的两个 execute 调用发生在同一个底层连接上,或者连接已关闭。

我可以假设这会“正常工作”吗?或者我需要注意这里的什么吗?

最佳答案

如果 (a) 您的 session 是一个 scoped_session 并且 (b) 您以非并发方式(相同的 pid/线程)使用它,它将“正常工作”。如果您太偏执,请确保(断言)您通过

使用相同的连接 ID
session.connection().connection.thread_id()

另外,没有必要将 session 作为参数传递。在应用程序全局范围内的某处初始化一次,然后在代码中的任何地方调用,您将获得相同的连接 ID。

关于python - SQLAlchemy session 和连接关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35594706/

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