如何在 SQLAlchemy 中设置连接超时

Posted

技术标签:

【中文标题】如何在 SQLAlchemy 中设置连接超时【英文标题】:How to set connection timeout in 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)

我该怎么办?

【问题讨论】:

【参考方案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

    使用SQLALCHEMY_ENGINE_OPTIONS 配置键(需要Flask-SQLAlchemy>=2.4)
SQLALCHEMY_ENGINE_OPTIONS = 
    'connect_args': 
        'connect_timeout': 5
    

    或者,在实例化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

也可能相关:

wait_timeout -- default value of 28800 seconds (8 hours) interactive_timeout -- default value of 28800 seconds (8 hours)

【讨论】:

【参考方案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。

以上是关于如何在 SQLAlchemy 中设置连接超时的主要内容,如果未能解决你的问题,请参考以下文章

建立多个连接时如何在C中设置套接字超时?

在 SQL Server 中设置最大连接超时的最佳方法

在 CodeIgniter 3 中设置数据库连接超时

如何在IIS中设置,客户端20分钟不操作,自动断开连接

在 python thrift 客户端中设置套接字的连接和读取超时

如何在IIS中设置,客户端20分钟不操作,自动断开连接