如何在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
也可能相关:
wait_timeout
-- default value of 28800 seconds (8 hours)
interactive_timeout
-- default value of 28800 seconds (8 hours)
对于 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
:
- 使用
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)
编辑:这些示例使用的 connect_timeout
参数(至少)适用于 MySQL 和 PostgreSQL(值表示秒),其他 DBMS 可能需要传递不同的参数名称以影响连接超时。我建议查看您的 DBMS 手册以检查此类选项。
我尝试对绑定的 mssql+pyodbc 数据库和默认 sqlite 执行此操作,但无法完成上述任何工作。
最终对我有用的是
SQLALCHEMY_ENGINE_OPTIONS = {
'connect_args': {"timeout": 10}
}
这也与SQLAlchemy docs一致
我正在尝试弄清楚如何在 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
也可能相关:
wait_timeout
-- default value of 28800 seconds (8 hours)interactive_timeout
-- default value of 28800 seconds (8 hours)
对于 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
:
- 使用
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)
编辑:这些示例使用的 connect_timeout
参数(至少)适用于 MySQL 和 PostgreSQL(值表示秒),其他 DBMS 可能需要传递不同的参数名称以影响连接超时。我建议查看您的 DBMS 手册以检查此类选项。
我尝试对绑定的 mssql+pyodbc 数据库和默认 sqlite 执行此操作,但无法完成上述任何工作。
最终对我有用的是
SQLALCHEMY_ENGINE_OPTIONS = {
'connect_args': {"timeout": 10}
}
这也与SQLAlchemy docs一致