如何在 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(),使用配置 PGDialect_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 中设置连接超时的主要内容,如果未能解决你的问题,请参考以下文章