如何在SQLAlchemy中设置连接超时

时间:2016-02-25 23:49:51

标签: python sqlalchemy

我试图弄清楚如何在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(),使用配置   PGD​​ialect_psycopg2 / QueuePool /引擎。请检查关键字   参数适用于这种组件组合。

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

(psycopg2.OperationalError)无效的连接选项   "超时"

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

(psycopg2.OperationalError)无效的连接选项   " connection_timeout"

create_engine(url, pool_timeout=10)

我该怎么办?

7 个答案:

答案 0 :(得分:31)

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

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

...它适用于Postgres和MySQL

答案 1 :(得分:0)

回应@nivhanin下面的评论,问及" connect_timeout变量的默认值是什么(一般而言,特定于MySQL数据库?"?(我没有足够的声誉)留下评论)。

Mysql5.7的connect_timeout默认为10 seconds

也许相关:

答案 2 :(得分:0)

对于sqlite后端:

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

会将连接超时设置为timeout

答案 3 :(得分:0)

对于 SQL Server ,请使用Remote Query Timeout

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

默认值为5秒。

答案 4 :(得分:0)

对于 SQLite 3.28.0:

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

将连接超时设置为1000秒。

答案 5 :(得分:0)

对于通过ibm_db2_sa + pyodbc的db2后端:

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

我发布此消息是为了省去别人看的麻烦。

答案 6 :(得分:0)

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

EDIT:示例使用的connect_timeout参数(至少)适用于MySQL和PostgreSQL(值表示秒),其他DBMS可能需要传递不同的参数名称以影响连接超时。我建议您查阅DBMS手册以检查是否有这种选择。