
Django-style фильтры поверх SQLAlchemy: зачем я написал python пакет sqlalchemy-query-manager
ViAchKoN 13 минут назад Django-style фильтры поверх SQLAlchemy: зачем я написал python пакет sqlalchemy-query-manager Простой 7 мин 368 Python * Open source * Веб-разработка * SQL * Кейс SQLAlchemy — очень удобный...
Anthropic — What company has the best second artificial intelligence model at the end of June?
Вот важная новость с фронта ИИ: ViAchKoN 13 минут назад Django-style фильтры поверх SQLAlchemy: зачем я написал python пакет sqlalchemy-query-manager Простой 7 мин 368 Python * Open source * Веб-разработка * SQL * Кейс SQLAlchemy — очень удобный инструмент. В нём явно видно, какой select() строится, где используются join, какие условия попадают в where, как загружаются связи и какой SQL в итоге уходит в базу. Но в обычном backend-коде далеко не каждый запрос является сложным.
Во многих Flask/FastAPI-сервисах есть большое количество однотипных запросов: отфильтровать записи, пройти по связи, добавить OR, отсортировать результат, ограничить количество строк, заранее загрузить связанные объекты и вернуть список результатов. Такой код часто выглядит примерно так:stmt = ( select(Item) . is_valid == True, Item.
Технические детали
options(joinedload(Item. limit(20) ) items = session. all()Проблема: бизнес-смысл запроса заметно короче, чем код вокруг него.
Фактически мы хотим сказать следующее:Дай мне валидные Item или Item с number > 100, только из активных групп, сразу загрузи group, отсортируй по number по убыванию и верни 20 строк. После нескольких десятков похожих запросов в приложении начинает хотеться более компактного слоя, который оставляет SQLAlchemy в основе, но убирает часть повторяющейся механики. Обычно такой слой всё равно появляется в проекте, даже если его никто специально не проектировал.
Сначала это несколько helper-функций для фильтров, потом общий код для сортировки и пагинации и так далее. В какой-то момент становится понятно, что уже написан собственный мини-query layer. В результате похожей истории я решил вынести этот слой в отдельный пакет.
Отраслевые последствия
Так и появился sqlalchemy-query-manager. Идея очень простая: добавить поверх SQLAlchemy небольшой query layer с Django-style фильтрами, Q-объектами, relationship lookups, eager loading и preview итогового SQL. Это вспомогательный слой для типовых backend-запросов, где прямой SQLAlchemy-код начинает выглядеть слишком громоздким.
Какой API хотелось получитьТот же запрос можно записать так:items = ( Item. where( Q(is_valid=True) | Q(number__gt=100), group__is_active=True, ) . select_related("group .
all() )Здесь остаётся тот же смысл:Q(is_valid=True) | Q(number__gt=100) описывает условие OR;group__is_active=True фильтрует по связанной модели;select_related("group явно говорит, что связь нужно загрузить заранее;order_by("-number сортирует по убыванию;limit(20) ограничивает результат;. all() выполняет запрос. Главная цель такого API — приблизить код к намерению, не теряя SQLAlchemy как основу.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.


