Как установить время ожидания соединения в SQLAlchemy

Я пытаюсь выяснить, как установить время ожидания подключения в create_engine()пока что пробовал:

create_engine(url, timeout=10)

TypeError: Недопустимые аргументы (аргументы) 'timeout' отправлены в create_engine() с использованием конфигурации PGDialect_psycopg2/QueuePool/Engine. Пожалуйста, убедитесь, что ключевые аргументы подходят для этой комбинации компонентов.

create_engine(url, connection_timeout=10)

TypeError: Недопустимые аргументы (аргументы) "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) неверный параметр соединения "connection_timeout"

create_engine(url, pool_timeout=10)

Что я должен делать?

9 ответов

Решение

Это правильный путь (connect_timeout вместо connection_timeout):

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

... и работает как с Postgres, так и с MySQL

Для тех, кто использует 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 (значение представляет секунды), другие СУБД могут потребовать передачи другого имени аргумента, чтобы повлиять на тайм-аут соединения. Я предлагаю проверить руководство к вашей СУБД, чтобы проверить наличие такой опции.

Для SQLite 3.28.0:

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

установит тайм-аут соединения на 1000 секунд.

По умолчанию для connect_timeout для Mysql5,7 это 10 секунд

Также может быть актуально:

За 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

Я публикую это, чтобы избавить других от необходимости искать.

ОБНОВЛЕНИЕ: для SQL Server используйте «время ожидания удаленного входа»:

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

Томаслевейл опубликовал 21 июня, но он был похоронен в комментариях, и это была единственная версия, которая работала для меня.

Я попытался сделать это для связанной базы данных mssql+pyodbc и sqlite по умолчанию и не смог заставить работать что-либо из вышеперечисленного.

Что, наконец, сработало для меня, было

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

Это также согласуется с документами SQLAlchemy.

Другие вопросы по тегам