python: sqlalchemy - 如何使用新的事件系统确保连接不会过时

2024-01-02

我正在 python 中使用 sqlalchemy 包。在现有表上执行自动加载后,我有一个操作需要一些时间才能执行。当我尝试使用连接时,这会导致以下错误:

sqlalchemy.exc.OperationalError: (OperationalError) (2006, 'MySQL server has gone away')

我有一个简单的实用函数,可以执行多次插入:

def insert_data(data_2_insert, table_name):
    engine = create_engine('mysql://blah:blah123@localhost/dbname')
    # Metadata is a Table catalog. 
    metadata = MetaData()
    table = Table(table_name, metadata, autoload=True, autoload_with=engine)
    for c in mytable.c:
        print c
    column_names = tuple(c.name for c in mytable.c)
    final_data = [dict(zip(column_names, x)) for x in data_2_insert]
    ins = mytable.insert()
    conn = engine.connect()
    conn.execute(ins, final_data)
    conn.close()

由于“data_2_insert”有 677,161 行,因此以下行的执行时间很长。

final_data = [dict(zip(column_names, x)) for x in data_2_insert]

我碰到这个问题 https://stackoverflow.com/questions/3033234/handle-mysql-restart-in-sqlalchemy这指的是类似的问题。但是我不确定如何实现建议的连接管理接受的答案 https://stackoverflow.com/a/3034003/445073因为 robots.jpg 在评论中指出了这一点:

SQLAlchemy 0.7 的注意事项 - PoolListener 已弃用,但可以使用新的实现相同的解决方案事件系统 http://docs.sqlalchemy.org/en/latest/core/pooling.html#disconnect-handling-pessimistic.

如果有人可以向我展示一些关于如何将这些建议集成到我使用 sqlalchemy 的方式中的指示,我将非常感激。谢谢。


我想你正在寻找这样的东西:

from sqlalchemy import exc, event
from sqlalchemy.pool import Pool

@event.listens_for(Pool, "checkout")
def check_connection(dbapi_con, con_record, con_proxy):
    '''Listener for Pool checkout events that pings every connection before using.
    Implements pessimistic disconnect handling strategy. See also:
    http://docs.sqlalchemy.org/en/rel_0_8/core/pooling.html#disconnect-handling-pessimistic'''

    cursor = dbapi_con.cursor()
    try:
        cursor.execute("SELECT 1")  # could also be dbapi_con.ping(),
                                    # not sure what is better
    except exc.OperationalError, ex:
        if ex.args[0] in (2006,   # MySQL server has gone away
                          2013,   # Lost connection to MySQL server during query
                          2055):  # Lost connection to MySQL server at '%s', system error: %d
            # caught by pool, which will retry with a new connection
            raise exc.DisconnectionError()
        else:
            raise

如果您希望有条件地触发此策略,您应该避免在此处使用装饰器,而是使用注册侦听器listen()功能:

# somewhere during app initialization
if config.check_connection_on_checkout:
    event.listen(Pool, "checkout", check_connection)

更多信息:

  • 连接池事件 http://docs.sqlalchemy.org/en/rel_0_8/core/event.html
  • 事件API http://docs.sqlalchemy.org/en/rel_0_8/core/events.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python: sqlalchemy - 如何使用新的事件系统确保连接不会过时 的相关文章

随机推荐

  • 如何配置 OpenSL 来录制语音通话

    我正在使用 MediaRecorder 开发通话录音应用程序语音通话音频源 在某些棉花糖设备中它崩溃了 然后我将源更改为MIC这里传入的声音没有被记录 由于java的限制 现在我正在研究原生android代码来录制语音通话 我设法使用录制音
  • python 不被识别为内部或外部命令[重复]

    这个问题在这里已经有答案了 我尝试安装this https github com joyent node wiki Installation软件 为此需要Python 我从以下位置安装了Pythonhere http python org
  • PHP 中的随机 ID/数字生成器

    我正在我的数据库中构建一个 代理 ID 列表 满足以下要求 ID 长度必须为 9 位 仅限数字 ID 中的相同数字不得超过 3 个 ID 不能包含超过 2 个连续的相同数字 即 887766551 不能有 888 到目前为止 我已经完成了第
  • 在 Python 中将数据添加到嵌套列表

    我有一个嵌套列表 例如 nlist 1 2 3 4 5 6 7 8 9 在将此列表插入数据库之前 我想向其中添加一个 列 并在新列的每一行中具有相同的值 例如 nlist a 1 2 3 a 4 5 6 a 7 8 9 例如 当原始嵌套列表
  • MVC 4 Web API 帖子

    我想从远程客户端进行插入 因为我需要通过 http 发送数据 我可以使用getPerformances 正确地与httpClient api performances date 0 我想问一下我的postPorformances 我内部的实
  • ProcessBuilder 和 Runtime.exec() 之间的区别

    我正在尝试从 java 代码执行外部命令 但我注意到两者之间存在差异Runtime getRuntime exec and new ProcessBuilder start 使用时Runtime Process p Runtime getR
  • Linux/C++ 如何调试发布应用程序

    我有 linux c 多线程应用程序 现在它已经在生产服务器上进行了测试并且出现了段错误 问题是我无法在任何测试服务器上重现该错误 并且无法访问生产服务器 我没有转储或任何其他有用的信息 仅行 段错误位于 0000000046bf0fb8
  • JTree,始终以“编辑模式”显示所有节点

    我正在显示自定义对象树 并且我有自定义对象CellTreeEditor and CellTreeRenderer set 现在我真正想要的是始终像 编辑模式 一样显示所有对象 现在我有CellTreeRenderer getTreeCell
  • 姜戈/彗星(推):万恶之中最小的?

    我已阅读了我能找到的所有有关 Django 和 HTTP Push 的问题和答案 然而 没有人提供一个清晰 简洁 从头到尾的解决方案来说明如何实现所谓的 comet 功能的基本 hello world 第一个问题 1 HTTP 的问题在多大
  • 在 Shell 脚本中将 Cron 作业设置为每月的第一个工作日

    我是脚本语言新手 谁能解释一下如何设置第一个工作日的 cron 作业 您可以使用以下内容 monthly 每月第一天早上运行一次 0 0 1 home scripts your script file sh 第三次编辑 这将在该月第一个工作
  • 在 OpenCV 中创建 AVI 文件

    我一直在尝试使用 OpenCV 和 Visual Studio 2008 创建一个应用程序 从网络摄像头捕获图像 对它们应用过滤器 然后将它们写入 AVI 文件 除了创建 AVI 文件之外 一切正常 问题是它在我的计算机上可以运行 但在我同
  • HashSet 如何与 hashCode() 配合使用?

    我试图更深入地了解 java util Collection 和 java util Map 但我对 HashSet 功能有一些疑问 在文档中 它说 此类实现 Set 接口 由哈希表 实际上是 HashMap 实例 支持 好的 所以我可以看
  • 抓取 NSDictionary 中的随机条目

    有没有办法在 NSDictionary 中获取完全随机的密钥 NSString key enumeratorForKeysInDictionary nextObject 我有这段代码以非随机方式迭代字典 我应该将所有键添加到 NSSet 中
  • 如何授予apache写入主目录的权限?

    我的服务器位于 var www html 我在 var www html fileio test io test php 有一个 php 脚本 当我尝试运行这个脚本时 我得到 Warning fopen home djameson test
  • Spring Security 配置自动装配自定义 UserDetailsS​​ervice bean

    我最近回到了我一直在从事的一个 Spring 项目 在启动应用程序时遇到了问题 这个问题可能是重复的 但我一直找不到答案 这是我原来的 SecurityConfig java 的一个片段 Configuration EnableWebSec
  • 如何使用Java找到矩阵的鞍点? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何使用Java找到矩阵的鞍点 该鞍点是行中最大的数字 同时也是列中最大的数字 例如 使用这个矩阵 7 2 1 3 5 8 鞍点是 7 和
  • Access - 根据不同的列值获取不同的行数

    我有一个具有以下格式的访问数据库 ID Period Data 13 1 xxxxx 13 2 xxxxx 25 1 xxxxx 25 2 xxxxx 25 3 xxxxx 52 1 xxxxx 52 3 xxxxx 94 1 xxxxx
  • CUDA 阻塞标志

    创建 CUDA 事件时 您可以选择打开cudaEventBlockingSync旗帜 但是 如果创建带有或不带有标志的事件之间存在差异怎么办 我阅读精美的手册 http developer download nvidia com compu
  • 将显示名称作为值的 Get-ADUser

    我在 CSV 文件中有用户显示名称列表 我试图获取 samAccountName 并将其导出到 CSV 文件 但它不起作用 我知道 get aduser 不接受显示名称作为值 所以我使用了过滤器 但仍然没有请工作帮助 CSV 文件格式 Us
  • python: sqlalchemy - 如何使用新的事件系统确保连接不会过时

    我正在 python 中使用 sqlalchemy 包 在现有表上执行自动加载后 我有一个操作需要一些时间才能执行 当我尝试使用连接时 这会导致以下错误 sqlalchemy exc OperationalError Operational