SQLAlchemy会话和连接关系

2024-04-05

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

一些背景:我需要使用 MySQL 的命名锁功能,即GET_LOCK() and 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

我想确定这两个人execute来电mysql_named_lock发生在同一底层连接上或连接已关闭。

我可以假设这会“正常工作”还是有什么我需要注意的?


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

session.connection().connection.thread_id()

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLAlchemy会话和连接关系 的相关文章

随机推荐

  • 使用python发送消息时出现错误400

    我正在尝试使用 Gmail API 发送电子邮件 我已成功通过身份验证 并且我的计算机上有一个 client secret json 文件 我已经能够使用 Gmail API 网站上的快速入门示例获取标签列表 我已成功将范围重置为 SCOP
  • 如何从蓝牙 LE 设备获取数据

    我有一台支持蓝牙 LE 的蓝牙条形码扫描仪 我试图在扫描时从中获取条形码信息 我可以正常连接onServicesDiscovered被叫到我的BluetoothGattCallback但我不知道从那里该做什么 通过经典的蓝牙连接 您将获得I
  • 使用 Redux 获取数据时如何避免竞争条件?

    我们有一个异步获取对象的操作 我们称之为getPostDetails 它需要一个参数来获取哪个帖子 一个 ID 用户会看到一个帖子列表 可以单击其中一个来获取一些详细信息 如果用户点击 Post 1 我们会发送一个GET POST动作可能看
  • 尝试连接到cleardb时出错

    再次嗨 我想连接到heroku中的cleardb实例 我从heroku配置变量中获取主机名和凭据CLEAR DATABASE URL但我收到以下错误 错误 2003 HY000 无法连接到 us cdbr east 06 cleardb n
  • 为什么我应该开始使用 Google Material Design Lite 而不是 Twitter Bootstrap 或 Foundation

    免责声明 我不想开始任何对抗谷歌粉丝 我只是问 因为我没有找到我的问题的直接答案 也许已经开始使用它的人 或任何谷歌开发人员 可以提供建议 谷歌最近宣布材料设计精简版 1 0 https developers google com web
  • (R, dplyr) 选择以相同字符串开头的多列并按组汇总平均值 (90% CI)

    我是 tidyverse 的新手 从概念上讲 我想计算以 ab 开头 按 case 分组的所有列的平均值和 90 CI 尝试了很多方法 但似乎都不起作用 我的实际数据有很多列 所以明确列出它们不是一个选择 测试数据如下 library ti
  • Keycloak 支持基本身份验证吗?

    Keycloak 是否支持基本身份验证 授权标头包含单词 Basic 单词 后跟一个空格和一个 base64 编码的字符串 username password 如果支持 我如何为其配置领域和客户端设置 我想使用 Keycloak 保护我的其
  • Android异常处理最佳实践?

    如果我的应用程序崩溃 它会挂起几秒钟 然后 Android 告诉我该应用程序崩溃并需要关闭 所以我正在考虑用一般的方法捕获我的应用程序中的所有异常 try catch Exception e 并制作一个新的Activity这解释了应用程序立
  • 如何确定日期是否是周末(不使用 lubridate)

    我有一个日期对象向量 yyyy mm dd 我想确定其中是否有周末 有没有一个函数可以直接确定这一点 我可以用wday in the 润滑封装然后判断返回值是否为01 or 07 但是还有其他更直接的吗 x lt seq Sys Date
  • 未捕获的类型错误:fs.readFileSync 不是函数

    我正在尝试获取 webpack 和地图盒 GL https github com mapbox mapbox gl js blob master webpack config example js在 Meteor 系统中协同工作 我到处都查
  • Folium 地图未在 Django 网页中显示

    对于 Django 以及一般的 Web 开发 来说非常陌生 所以提前道歉 我试图在 Django 网页中显示我的 Folium 地图 但我似乎不明白为什么我最终会得到一个空白屏幕 我在 SO 中查找了其他帖子 但他们都要求要么专门弹出窗口
  • 如何从 git 历史记录中删除除最后 n 次提交之外的所有提交以节省空间

    我使用 git 来备份和恢复系统上可能发生更改的文件夹 并且随着无用的历史记录的积累 它们可能会变得非常大 我只需要最后 4 次左右的提交 如何压缩或删除除最后 n 次提交之外的整个历史记录 免责声明 不幸的是 您的第一句话可能玷污了这个问
  • 无法从“sudo bundle install”恢复

    错误地我跑了sudo bundle install在我的项目上 现在当我自己运行它时bundle install我收到权限被拒绝的错误 如下 我尝试了这里的说明https github com bundler bundler blob ma
  • Selenium 和 Python3 ChromeDriver 引发消息:无法连接到服务 chromedriver

    请问在这种情况下如何让硒发挥作用 我已经多次看到这个问题 但答案很少或没有 我希望今天运气站在我这边 让我首先详细介绍我的环境 我在跑步macOS 塞拉利昂 我在用virtualenv virtualenvwrapper with pyth
  • 多彩多姿的编辑文本提示

    有没有办法在 android support design widget TextInputLayout 包装时为 edittext 的提示设置多种颜色 而不影响浮动 edittexts 的行为 喜欢 标题 标题和 带有不同颜色的提示 尝试
  • 无法创建类型“Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter,Common.Logging.Log4Net”

    我在解决方案中有包含其他类库的 WCF 项目 我使用 nuget 包管理器为需要日志记录的项目添加了 Common Logging 我收到此错误 无法创建类型 Common Logging Log4Net Log4NetLoggerFact
  • CakePHP:用 save() 进行加/减?

    我试图通过 Cake 的 save 函数简单地执行以下操作 UPDATE user SET value value 1 不过 好像只能设定 它不会理解我传递给它来增加或减少的任何内容 并且互联网上似乎没有人遇到这个问题 P 即使在浏览某人在
  • 将 props 传递给 React-Redux 容器组件

    我有一个在 React Native Navigator 组件中创建的 React Redux 容器组件 我希望能够将导航器作为道具传递给该容器组件 以便在其演示组件内按下按钮后 它可以将对象推送到导航器堆栈上 我想做到这一点 而不需要手动
  • 将 LINQPad 连接到远程 SQL Server

    免责声明 我知道这个问题是非常基本的 但我无法在谷歌或这里找到答案 并且无法通过猜测的配置自己完成 我想开始使用 LINQPad 并且我在同一域的不同计算机上安装了 SQL Server 2005 但我无法从 LINQPad 连接到该服务器
  • SQLAlchemy会话和连接关系

    是否使用相同的 SQLAlchemy 执行查询session对象使用相同的底层连接 如果没有 有没有办法保证这一点 一些背景 我需要使用 MySQL 的命名锁功能 即GET LOCK and RELEASE LOCK 功能 就MySQL服务