如何在SQLAlchemy中设置连接超时

How to set connection timeout in SQLAlchemy

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

create_engine(url, timeout=10)

TypeError: Invalid argument(s) 'timeout' sent to create_engine(), using configuration PGDialect_psycopg2/QueuePool/Engine. Please check that the keyword arguments are appropriate for this combination of components.

create_engine(url, connection_timeout=10)

TypeError: Invalid argument(s) 'connection_timeout' sent to create_engine(), using configuration PGDialect_psycopg2/QueuePool/Engine. Please check that the keyword arguments are appropriate for this combination of components.

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

(psycopg2.OperationalError) invalid connection option "timeout"

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

(psycopg2.OperationalError) invalid connection option "connection_timeout"

create_engine(url, pool_timeout=10)

我该怎么办?

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

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

...它适用于 Postgres 和 MySQL

ps:(超时以秒为单位定义)

回应@nivhanin 在下面的评论,其中询问 "What is the default value for the connect_timeout variable (in general and specific to MySQL database?"? (我没有足够的声誉来发表评论)。

connect_timeout 的默认值 Mysql5.7 是 10 seconds

也可能相关:

对于 sqlite 后端:

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

会将连接超时设置为 timeout

对于 SQL 服务器 使用 Remote Query Timeout:

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

默认为 5 秒。

对于 SQLite 3.28.0:

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

将连接超时设置为 1000 秒。

对于 db2 后端通过 ibm_db2_sa + pyodbc:

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

我发布这个是为了让其他人省去查找的麻烦。

对于使用 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)

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

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

最终对我有用的是

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

这也与SQLAlchemy docs一致