В основном из любопытства, я ищу Python-фреймворк или пример для Repository Pattern для отделения логики персистентности от логики предметной области.
Название «Шаблон репозитория» появляется в посте « Распутать домен и логика постоянства с куратором » (Ruby), идея взята из раздела «Проекта, управляемого доменом» Книга и Мартин Фаулер . Класс модели не содержит логики персистентности, скорее, приложение объявляет подклассы репозитория, экземпляры которых действуют как коллекции экземпляров модели в памяти. Каждый репозиторий сохраняет модель по-разному, например, в SQL (различные соглашения о схемах), в Riak или другом noSQL и в памяти (для кэширования). В соответствии с рамочными соглашениями подклассы репозитория обычно требуют минимального кода: простое объявление подкласса «WidgetRepository» в SQLRepository обеспечит коллекцию, которая сохранит виджет модели в таблице БД с именем «widgets» и сопоставит столбцы с атрибутами Widget.
Отличия от других моделей:
Шаблон активной записи : например, Django ORM. Приложение определяет только класс модели с доменной логикой и некоторыми метаданными для сохранения. ORM добавляет логику персистентности к классу модели. Это смешивает домен и постоянство в одном классе (нежелательно согласно посту).
Благодаря @marcin я вижу, что когда Active Record поддерживает разные бэкэнды и функцию .save (using = "other_database"), это дает мульти-бэкэнд-преимущество шаблона репозитория.
Таким образом, в некотором смысле шаблон репозитория подобен Active Record с логикой постоянства, перемещенной в отдельный класс.
Шаблон сопоставления данных : например, Классические сопоставления SQLAlchemy. Приложение определяет дополнительные классы для таблиц базы данных и преобразователя (ей) данных от модели к таблице (ам). Таким образом, экземпляр модели может быть отображен в таблицы несколькими способами, например, поддерживать устаревшие схемы. Не думайте, что SQLAlchemy предоставляет сопоставители для хранилищ, отличных от SQL.