【发布时间】:2012-03-30 18:32:38
【问题描述】:
主要出于好奇,我正在寻找一个 Python 框架或用于将持久性逻辑与域逻辑解耦的存储库模式的示例。
名称“存储库模式”出现在帖子“Untangle Domain and Persistence Logic with Curator”(Ruby)中,想法来自“领域驱动设计”一书的section 和Martin Fowler。模型类不包含持久性逻辑,而是应用程序声明存储库子类,其实例的作用类似于模型实例的内存集合。每个存储库以不同的方式保存模型,例如 SQL(各种模式约定)、Riak 或其他 noSQL 以及内存(用于缓存)。框架约定意味着存储库子类通常需要最少的代码:只需声明 SQLRepository 的“WidgetRepository”子类将提供一个集合,该集合将模型 Widget 持久保存到名为“widgets”的数据库表中,并将列与 Widget 属性匹配。
与其他模式的区别:
活动记录模式:例如,Django ORM。应用程序只定义了具有域逻辑的模型类和一些用于持久性的元数据。 ORM 将持久性逻辑添加到模型类。这将域和持久性混合在一个类中(根据帖子,这是不受欢迎的)。
感谢@marcin,我看到当 Active Record 支持不同的后端和 .save(using="other_database") 函数时,这提供了存储库模式的多后端优势。
所以在某种意义上,Repository Pattern 就像 Active Record 一样,将持久性逻辑移到了一个单独的类中。
Data Mapper Pattern:例如,SQLAlchemy 的 Classical Mappings。该应用程序为数据库表定义了额外的类,以及从模型到表的数据映射器。因此模型实例可以通过多种方式映射到表,例如支持遗留模式。不要认为 SQLAlchemy 为非 SQL 存储提供映射器。
【问题讨论】:
-
您的研究表明了什么?我只是轻松地用谷歌搜索了一些替代品。
-
谷歌搜索
python "repository pattern"没有找到任何实现。您到底搜索了什么? -
StackExchange 上也没有任何相关问题 - 它们主要是关于 NHibernate
-
@marcin AFAIK Django ORM 为每个模型生成 SQL(仅一种表示形式)。存储库模式 OTOH 为每个后端(例如 SQL、MongoDB、内存)提供集合类,子类化以提供多种方式来持久化模型。