【问题标题】:How to set connection timeout in SQLAlchemy如何在 SQLAlchemy 中设置连接超时
【发布时间】:2016-06-09 00:28:30
【问题描述】:

我正在尝试弄清楚如何在create_engine() 中设置连接超时,到目前为止我已经尝试过:

create_engine(url, timeout=10)

TypeError:使用配置 PGDialect_psycopg2/QueuePool/Engine 将无效参数“超时”发送到 create_engine()。请检查 关键字参数适合这种组合 组件。

create_engine(url, connection_timeout=10)

TypeError: 发送到的参数“connection_timeout”无效 create_engine(),使用配置 PGD​​ialect_psycopg2/QueuePool/引擎。请检查关键字 参数适用于这种组件组合。

create_engine(db_url, connect_args={'timeout': 10})

(psycopg2.OperationalError) 无效的连接选项 “超时”

create_engine(db_url, connect_args={'connection_timeout': 10})

(psycopg2.OperationalError) 无效的连接选项 “连接超时”

create_engine(url, pool_timeout=10)

我该怎么办?

【问题讨论】:

    标签: python postgresql sqlalchemy psycopg2


    【解决方案1】:

    正确的方法是这个(connect_timeout而不是connection_timeout):

    create_engine(db_url, connect_args={'connect_timeout': 10})
    

    ...它适用于 Postgres 和 MySQL

    ps:(超时以秒为单位)

    【讨论】:

    • connect_timeout 变量的默认值是多少(一般来说和特定于 MySQL 数据库?
    • FWIW,此语法记录在这里:docs.sqlalchemy.org/en/latest/core/…
    • timeout 用于 pymssql。
    • 10 什么?分钟、秒或毫秒?
    • @Ganesh Satpute 秒!
    【解决方案2】:

    对于使用 Flask-SQLAlchemy 而不是普通 SQLAlchemy 的人,您可以选择两种方式将值传递给 SQLAlchemy 的create_engine

    1. 使用SQLALCHEMY_ENGINE_OPTIONS 配置键(需要Flask-SQLAlchemy>=2.4)
    SQLALCHEMY_ENGINE_OPTIONS = {
        'connect_args': {
            'connect_timeout': 5
        }
    }
    
    1. 或者,在实例化flask_sqlalchemy.SQLAlchemy 时使用engine_option
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    db = SQLAlchemy(
        engine_options={ 'connect_args': { 'connect_timeout': 5 }}
    )
    
    db.init_app(app)
    

    编辑:示例使用connect_timeout 参数(至少)适用于 MySQL 和 PostgreSQL(值表示秒),其他 DBMS 可能需要传递不同的参数名称以影响连接超时。我建议查看您的 DBMS 手册以检查此类选项。

    【讨论】:

      【解决方案3】:

      回应@nivhanin 下面的评论,该评论询问“connect_timeout 变量的默认值是多少(一般和特定于 MySQL 数据库?”?(我没有足够的声望离开 cmets)。

      Mysql5.7 的connect_timeout 默认是10 seconds

      也可能相关:

      【讨论】:

        【解决方案4】:

        对于 SQLite 3.28.0:

        create_engine(db_name, connect_args={'timeout': 1000})
        

        将连接超时设置为 1000 秒。

        【讨论】:

          【解决方案5】:

          对于sqlite 后端:

          create_engine(db_url, connect_args={'connect_timeout': timeout})
          

          将连接超时设置为timeout

          【讨论】:

            【解决方案6】:

            对于 SQL Server 使用 Remote Query Timeout:

            create_engine(db_url, connect_args={'Remote Query Timeout': 10})
            

            默认为 5 秒。

            【讨论】:

            • 你有默认超时为 5 秒的来源吗? As far as I can see in the docs,默认为 600 秒,这更符合我在应用程序中遇到的错误类型。
            【解决方案7】:

            对于 db2 后端,通过ibm_db2_sa + pyodbc

            我查看了源码,从0.3.5版本(2019/05/30)开始似乎没有办法控制连接超时: https://github.com/ibmdb/python-ibmdbsa

            我发这个是为了省去别人看的麻烦。

            【讨论】:

              【解决方案8】:

              我尝试对绑定的 mssql+pyodbc 数据库和默认的 sqlite 执行此操作,但无法完成上述任何操作。

              最终对我有用的是

              SQLALCHEMY_ENGINE_OPTIONS = {
                      'connect_args': {"timeout": 10}
                  }
              

              这也与SQLAlchemy docs一致

              【讨论】:

              • TypeError: 'timeout' is an invalid keyword argument for this function 在 oracle 上不起作用
              • 是的,它仅适用于 microsoft sql server + sqlite。
              猜你喜欢
              • 1970-01-01
              • 2018-12-19
              • 2011-03-22
              • 1970-01-01
              • 1970-01-01
              • 2013-01-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多