Комментарии 4
Вообще не понял зачем смешивать репозиторий и UoW. Совершенно перпендикулярные паттерны.
Причём здесь репозитории и UoW? Кстати о generic репозиториях - why the generic repository is just a lazy anti pattern
В статье код как-будто бы из алхимии < 1.4, уже на 1.4 session.query считалось устаревшим, а с 2.0 это уже deprecated подход(конструкцию не удалили, но внутри она теперь работает так же как sqlalchemy.select)
Когда увидел заголовок статьи, подумал что наконец-то увижу как люди пишут свой UoW для core алхимии, но оказалось что опять собрали все репозитории в одном место и добавили .commit и .rollback. Имхо, если нужен такой интерфейс, то хотя бы репозитории надо из него удалить, нет же проблем прокинуть одну и ту же сессию в разные репозитории.
Мне кажется, вы искажаете смысл этих паттернов, описывая нечто другое...
Вы описываете UnitOfWork, как объект, который отслеживает изменения выгружаемых сущностей. При этом выбрали для примера SQLAlchemy, в которой эта логика инкапсулирована внутри session. Получается, вы не показали, как работает паттерн, а показали пример делегирования.
Потом перешли к описанию паттерна Repository. Он инкапсулирует работу с базой данных. Но его цель - сделать доменную модель независимой от метода хранения данных. А в вашем случае это просто интерфейс. При этом вы возвращаете через него объекты моделей SQLAlchemy...
Эта статья действительно из разряда "Unit Of Work, который мы заслужили" : )
Что, кстати, делать, если нужны запросы, выходящие за пределы CRUD? Расширять базовый репозиторий методами? И в примерах - нет последовательности, те же BookRepository, UserRepository и RentalRepository - уже не являются наследниками базового репозитория, тогда зачем он вообще был введен?
В общем - искания автора поддерживаю; представленная реализация - далека от адекватности.
Паттерн Unit of Work в Python с SQLAlchemy