如何在SQLAlchemy中设置连接超时

问题描述 投票:0回答:9

我正在尝试弄清楚如何在

create_engine()
中设置连接超时,到目前为止我已经尝试过:

create_engine(url, timeout=10)

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

create_engine(url, connection_timeout=10)

类型错误:发送到的参数“connection_timeout”无效 create_engine(),使用配置 PGDialect_psycopg2/QueuePool/Engine。请检查关键字是否正确 参数适合这种组件组合。

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
9个回答
97
投票

正确的方法是这个(

connect_timeout
而不是
connection_timeout
):

# NOTE: timeout units are seconds
create_engine(db_url, connect_args={'connect_timeout': 10})

...并且它可以与 Postgres 和 MySQL 一起使用

文档 sqlalchemy connect-args


23
投票

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

create_engine
:

  1. 使用
    SQLALCHEMY_ENGINE_OPTIONS
    配置密钥(需要 Flask-SQLAlchemy>=2.4)
SQLALCHEMY_ENGINE_OPTIONS = {
    'connect_args': {
        'connect_timeout': 5
    }
}
  1. 或者,在实例化
    engine_option
     时使用 
    flask_sqlalchemy.SQLAlchemy
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)

编辑:这些示例使用(至少)适用于 MySQL 和 PostgreSQL 的

connect_timeout
参数(值代表秒),其他 DBMS 可能需要传递不同的参数名称来影响连接超时。我建议检查您的 DBMS 手册以检查此类选项。


7
投票

回应@nivhanin 下面的评论,其中询问“connect_timeout 变量的默认值是多少(一般情况下和特定于 MySQL 数据库?”?(我没有足够的声誉来发表评论)。

Mysql5.7

connect_timeout
默认为10秒

也可能相关:


6
投票

对于 SQLite 3.28.0:

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

将连接超时设置为 1000 秒。


2
投票

对于

sqlite
后端:

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

会将连接超时设置为

timeout


2
投票

对于 SQL Server 使用

Remote Query Timeout
:

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

默认为 5 秒。


1
投票

对于 db2 后端,通过

ibm_db2_sa
+
pyodbc
:

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

我发布此内容是为了省去其他人查找的麻烦。


0
投票

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

最终对我有用的是

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

这也与 SQLAlchemy 文档 一致


0
投票

更新:对于 SQL Server 使用“远程登录超时”:

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

Thomasleveil 于 6 月 21 日发布,但它被隐藏在评论中,并且是唯一对我有用的版本。

© www.soinside.com 2019 - 2024. All rights reserved.