Есть ли способ обработать разъединение в БД URI? - PullRequest
1 голос
/ 01 октября 2019

Мне интересно, есть ли способ установить pool_pre_ping в URI базы данных, чтобы я не касался действительного кода и не использовал какой-либо тип проверки SELECT[1] conn?

В конфигурации следующийчитается следующая переменная:

SQLALCHEMY_DATABASE_URI = f'postgresql+psycopg2://{user}:{pw}@db:5432/{db}'

Я хотел бы добавить pool_pre_ping параметр вроде:

SQLALCHEMY_DATABASE_URI = f'postgresql+psycopg2://{user}:{pw}@db:5432/{db} [SOMETHING pool_pre_ping=True]'

Проблема, связанная с необходимостью установки pool_pre_ping, заключается в том, что клиентская сторона иногда отключаетдБ соединение и приложение не может предложить ответ. Прежде чем установить первоначальную причину этой проблемы, я должен предотвратить разъединения .. так или иначе. Я работаю с контейнерами Docker.

Я очень благодарен, если вы можете предложить мне несколько советов. Спасибо: -)

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

В Flask-SQLAlchemy v2.4 это было сделано намного проще.

Конфигурационный ключ SQLALCHEMY_ENGINE_OPTIONS был добавлен специально для того, чтобы сделать настройку create_engine через ваше приложение-колбу менее жесткой ( * документы * 1006). Так что в вашем случае добавление app.config["SQLALCHEMY_ENGINE_OPTIONS"] = {"pool_pre_ping": True} приведет к тому, что вы хотите.

В качестве альтернативы (снова 2.4+), вы можете передать вхождение аргументов ключевых слов в параметр engine_options конструктора SQLAlchemy() (* 1012)* docs ), например, SQLAlchemy(app, engine_options={"pool_pre_ping": True}) эквивалентно приведенному выше, за исключением того, что эти значения будут объединяться и иметь приоритет над любыми настройками двигателя, также определенными в SQLALCHEMY_ENGINE_OPTIONS.

0 голосов
/ 01 октября 2019

Спасибо большое! Теперь это работает: -)

Я сделал следующее:

(я не настроил "pool_pre_ping" в URI, но добавил несколько строк в коде)

из импорта flask_sqlalchemySQLAlchemy as _NSQLAlc ...

класс SQLAlchemy (_NSQLAlc): def apply_pool_defaults (self, app, options): super (SQLAlchemy, self) .apply_pool_defaults (app, options) options ["pool_pre_ping"] = True

db = SQLAlchemy ()

...