Как установить время ожидания соединения в 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
:
- Использовать
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 (значение представляет секунды), другие СУБД могут потребовать передачи другого имени аргумента, чтобы повлиять на тайм-аут соединения. Я предлагаю проверить руководство к вашей СУБД, чтобы проверить наличие такой опции.
Для SQLite 3.28.0:
create_engine(db_name, connect_args={'timeout': 1000})
установит тайм-аут соединения на 1000 секунд.
По умолчанию для connect_timeout
для Mysql5,7 это 10 секунд
Также может быть актуально:
wait_timeout
- значение по умолчанию 28800 секунд (8 часов)interactive_timeout
- значение по умолчанию 28800 секунд (8 часов)
За 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.