Реализация шаблона репозитория в Python?

В основном из любопытства я ищу фреймворк Python или пример для шаблона репозитория, который отделяет логику постоянства от логики домена.

Название «Шаблон репозитория» появляется в сообщении «Untangle Domain and Persistence Logic with Curator» (Ruby), идея взята из разделакниги «Domain-Driven Design» и Martin FowlerКласс модели не содержит логики персистентности, скорее приложение объявляет подклассы репозитория, экземпляры которых действуют как колле в памяти. действия экземпляров модели. Каждый репозиторий сохраняет модель по-разному, например, в SQL (различные соглашения о схеме), в Riak или другом noSQL и в памяти (для кэширования).Соглашения фреймворка означают, что подклассы репозитория обычно требуют минимального кода: простое объявление подкласса WidgetRepository для SQLRepository предоставит коллекцию, которая сохраняет виджет модели в таблице БД с именем «виджеты» и сопоставляет столбцы с атрибутами виджета.

Отличия от других шаблонов:

Шаблон Active Record: например, Django ORM. Приложение определяет только класс модели с логикой предметной области и некоторыми метаданными для сохранения. ORM добавляет логику постоянства в класс модели. Это смешивает домен и постоянство в одном классе (нежелательно, согласно сообщению).

Благодаря @marcin я вижу, что, когда Active Record поддерживает различные бэкенды и функцию .save(using="other_database"), это дает преимущество шаблона репозитория с несколькими бэкендами.

Таким образом, шаблон репозитория в некотором смысле похож на Active Record, но логика сохраняемости перемещена в отдельный класс.

Шаблон сопоставления данных: например, классические сопоставления SQLAlchemy. Приложение определяет дополнительные классы для таблиц базы данных и преобразователи данных из модели в таблицу (таблицы). Таким образом, экземпляр модели может быть сопоставлен с таблицами несколькими способами, например. для поддержки устаревших схем. Не думайте, что SQLAlchemy предоставляет средства сопоставления с хранилищем, отличным от SQL.

24
задан Vini.g.fer 5 March 2018 в 12:11
поделиться