我正在尝试弄清楚如何在
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)
我该怎么办?
正确的方法是这个(
connect_timeout
而不是connection_timeout
):
# NOTE: timeout units are seconds
create_engine(db_url, connect_args={'connect_timeout': 10})
...并且它可以与 Postgres 和 MySQL 一起使用
对于使用 Flask-SQLAlchemy 而不是普通 SQLAlchemy 的人,您可以选择两种将值传递给 SQLAlchemy 的方法
create_engine
:
SQLALCHEMY_ENGINE_OPTIONS
配置密钥(需要 Flask-SQLAlchemy>=2.4)SQLALCHEMY_ENGINE_OPTIONS = {
'connect_args': {
'connect_timeout': 5
}
}
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 手册以检查此类选项。
回应@nivhanin 下面的评论,其中询问“connect_timeout 变量的默认值是多少(一般情况下和特定于 MySQL 数据库?”?(我没有足够的声誉来发表评论)。
Mysql5.7
connect_timeout
默认为10秒
也可能相关:
wait_timeout
-- 默认值 28800 秒(8 小时)interactive_timeout
-- 默认值 28800 秒(8 小时)对于 SQLite 3.28.0:
create_engine(db_url, connect_args={'timeout': 1000})
将连接超时设置为 1000 秒。
对于
sqlite
后端:
create_engine(db_url, connect_args={'connect_timeout': timeout})
会将连接超时设置为
timeout
。
对于 SQL Server 使用
Remote Query Timeout
:
create_engine(db_url, connect_args={'Remote Query Timeout': 10})
默认为 5 秒。
对于 db2 后端,通过
ibm_db2_sa
+ pyodbc
:
我查看了源码,从0.3.5版本(2019/05/30)开始似乎没有办法控制连接超时: https://github.com/ibmdb/python-ibmdbsa
我发布此内容是为了省去其他人查找的麻烦。
我尝试对绑定的 mssql+pyodbc 数据库和默认 sqlite 执行此操作,但无法完成上述任何操作。
最终对我有用的是
SQLALCHEMY_ENGINE_OPTIONS = {
'connect_args': {"timeout": 10}
}
这也与 SQLAlchemy 文档 一致
更新:对于 SQL Server 使用“远程登录超时”:
create_engine(db_url, connect_args={'remote login timeout': 10})
Thomasleveil 于 6 月 21 日发布,但它被隐藏在评论中,并且是唯一对我有用的版本。