Подключение к пулу SQLAlchemy / Flask / PostgreSQL

Поиграв долгое время с Django, я немного попробовал Flask с SQLAlchemy, и должен сказать, что мне это очень нравится. Однако есть кое-что, чего я не понимаю: у меня есть небольшое приложение Flask/SQLAlchemy, которое использует PostgreSQL. В моем файле __init__.py у меня есть:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.from_object('settings')
db = SQLAlchemy(app)

Я хотел знать:

  1. Существует ли автоматический пул соединений? Или каждый вызов Model.query... создает новое соединение с базой данных?
  2. Если нет, то как мне его настроить?
  3. Если да, то каковы значения по умолчанию, как я могу изменить значения?

Большое спасибо за помощь!


person Noé Malzieu    schedule 11.04.2013    source источник


Ответы (3)


Flask-SQLAlchemy создает механизм SQLAlchemy, используя метод create_engine в SQLAlchemy, о некоторых параметрах и значениях по умолчанию вы можете прочитать в файле документация по функции create_engine. Согласно документации Flask-SQLAlchemy, вы можете указать некоторые параметры конфигурации, относящиеся к пулу. Вы можете установить эти значения различными способами, о которых вы можете прочитать в конфигурации Flask. У вас уже есть модуль конфигурации settings, поэтому вы можете добавить в свой файл конфигурации что-то вроде...

SQLALCHEMY_POOL_SIZE=10

Итак, да, есть автоматический пул соединений. Это предоставляется SQLAlchemy по умолчанию. На момент публикации этого ответа Flask-SQLAlchemy позволяет вам изменять некоторые из этих параметров с помощью файла конфигурации (хотя, похоже, существует старый запрос на вытягивание, позволяющий указать ЛЮБОЙ параметр create_engine).

Если вам нужна дополнительная поддержка для настройки механизма SQLAlchemy, чем предоставляет Flask-SQLAlchemy, вы можете либо использовать SQLAlchemy без оболочки Flask-SQLAlchemy, либо изменить Flask-SQLAlchemy (возможно, объединив запрос на вытягивание), чтобы разрешить это.

person Mark Hildreth    schedule 11.04.2013
comment
Большое спасибо за подробный ответ! Должно быть, я пропустил эту часть в документации Flask-SQLAlchemy! - person Noé Malzieu; 11.04.2013
comment
Любая идея о том, как установить пул соединений на NullPool ? - person Matthew Moisen; 19.06.2016

Каждый воркер вашего экземпляра flask, на котором запущен правильный сервер wsgi с несколькими воркерами, будет иметь свой собственный движок, потому что ваш скрипт загружается для каждого воркера отдельно.

Как следствие, у вас просто нет контроля над реальным пулом, за исключением того, что вы ограничиваете свои рабочие потоки сервера wsgi и вычисляете максимально допустимое количество соединений для каждого экземпляра движка/пула.

Более подробную информацию можно прочитать по адресу https://docs.sqlalchemy.org/en/13/core/pooling.html#using-connection-pools-with-multiprocessing

person Jan Z    schedule 07.04.2020
comment
Это ключевой момент. По умолчанию POOL_SIZE равно 5, что меня очень смутило, когда я напрямую просмотрел подключения к базе данных и увидел, что их 15 (я использую gunicorn с 4 работниками). Я понятия не имел, почему, пока не прочитал это. Благодарю вас! - person Brady Perry; 22.04.2021

NullPool можно установить в методе create_engine.

` from sqlalchemy.pool import NullPool
  engine = create_engine('db connection url',poolclass=NullPool)`
person amj    schedule 09.11.2018
comment
Это не отвечает на вопрос ОП. - person SuperShoot; 10.11.2018
comment
@SuperShoot ответили на часть одного из комментариев. Они спросили, как установить его в нулевой пул. - person amj; 13.08.2019