Обновить

Комментарии 13

Почему просто sqlalchemy orm не использовать?

ORM Query Builder составляет запросы при помощи sqlalchemy orm, метод build генерирует этот запрос. ORM Query Builder конфиги преобразовывает в sqlalchemy запрос.

Не увидел ответа на вопрос

Если я правильно понял, то вы говорите о построении sqlalchemy запроса руками в методе репозитория. При написании проекта я столкнулся с тем, что каждый метод содержит sqlalchemy запрос только под одну конкретную задачу и соответственно их приходится постоянно плодить. Моё решение просто сокращает эти методы, позволяя гибко получать данные из одного метода, ORM Query Builder это по сути надстройка над sqlalchemy orm. Если я всё ещё не ответил на ваш вопрос, то дайте чуть больше информации. ORM Query Builder это по сути небольшая надстройка над sqlalchemy orm

А зачем? На уровне Select нельзя было остатся? Выглядит так, что немного дописав ваш код, он будет способен сам самостоятельно генерировать sql и sqlalchemy не нужен.

ORM Query Builder идёт в качестве надстройки, чтобы обрабатывать конфиги и возвращать готовый sqlalchemy запрос. Если я правильно понял выражение "На уровне Select", то нет, остаться нельзя, потому что тогда в одном методе, где будет создаваться этот select запрос, придётся писать довольно много строк кода для обработки конфигов, здесь можете посмотреть как именно вызываются методы SQLAlchemyQueryBuilder из метода репозитория.

В итоге детали реализации протекли за пределы репозитория. Как бы теперь выглядела реализация для Mongo или Redis?

А кому оно надо? Кто кроме Роберта Мартина меняет бд пять раз на дню? Да ещё и с транзакционной на олап, потом на инмемори, потом на файловое хранилище?

роберт мартин кста пишет что не надо в бд, пока и если это не потребуется, а сначала советует в файлы :)

Да, я про это же, у него же суть в том, чтобы максимально абстрагироваться от бд, чтобы "можно было поменять в любой момент". Что никак не бьётся с реальностью вообще.

Можете пожалуйста уточнить, где именно детали реализации просочились за пределы репозитория? По поводу Mongo могу сказать, что ещё не пробовал масштабировать на неё, но всё по такому же принципу как и в SQLAlchemy, придумать отдельный Query Builder. Для Redis я создаю отдельный от репозитория интерфейс Cache.

async def read(
    self,
    ...
    joins: list[JoinConfig] = [],
    loads: list[LazyLoadConfig] = [],
    ...
)

Из вроде бы абстракного репозитория торчат какие-то join-ы и load-ы, т.е. детали того, что вы используете РСУБД и конкретно SQLAlchemy ORM (так как варианты в LazyLoadType используются именно оттуда). В FilterType присутствует какой-то VECTOR_SORT, который, подозреваю, тоже существует не во всех СУБД.

Redis не обязательно используется именно как кэш, и я его привел просто в качестве примера другого типа хранилища.

Может быть я не до конца понял задумку, и у вас не было цели полностью абстрагироваться от деталей используемого хранилища, но тогда, как справедливо заметил @whoisking, зачем создавать query builder вокруг уже предоставленного в SQLAlchemy. Вы же приводите пример решения для "сложных" запросов, а таких, как правило, немного, и они не слишком пересекаются в реализации.

Да, соглашусь, выглядит это не особо красиво. Для большей абстракции можно опробовать убрать LazyLoadType и VECTOR_SORT заменить на просто SEARCH. Благодаря Query Builder, бизнес логика может максимально удобно получать нужные данные, посредством одного метода репозитория. Если использовать sqlalchemy orm, то каждый метод будет узко специализирован под конкретный запрос, также может быть и такое, что метод репозитория будет вызван только один раз в каком то месте бизнес логики. Как раз таки под сложными запросами я и подразумеваю те, которые в бизнес логике используются один раз. Вместо создания множества лишних методов, которые также нужно описывать в интерфейсе, можно передать в метод репозитория конфиги, которые потом обработает Query Builder и сформирует из них sqlalchemy запрос. В моём решении могут быть проблемы, но я пытаюсь преподнести именно идею, необязательно всё делать так, как описал я.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации