我正在使用 DDD 方法实现一个应用程序。我想将域模型分离到一个单独的包中,声明一个存储库,实现将在一个单独的包中使用 SQLAlchemy 作为 ORM。
从域的角度来看,用户看起来像:
class User:
def __init__(self, name):
self.id = autogenerate_id()
self.name = name
但是对于SQLAlchemy,它应该实现为:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
我的问题是:是否有任何方法可以最大限度地减少定义 SQLAlchemy 模型所需的工作量:
- 我不必从域-SQLAlchemy 编写映射代码,反之亦然
- 我可以“保证”我没有忘记在 SQLAlchemy 对应项中包含来自域的任何属性(在对域模型进行更改时)。
最佳答案
如果我理解正确的话,您希望有两个聚合 DTO 的实现,而不会将 sqlalchemy 表映射到 python 数据结构。在这种情况下,我建议您创建 UserDTO 接口(interface),该接口(interface)将由 SQLAlchemy 模型和纯域实现(用于测试?)实现。
class User:
id: int
name: Text
class PlainUser(User):
def __init__(self, name):
self.id = autogenerate_id()
self.name = name
class DBUser(db.Model, User):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
关于将 DTO 映射到 DB 以及如何实现它的策略。还有关于我在这篇文章中写的更多Persistency of DDD aggregate
希望它能帮助您解决在使用 DDD 的过程中遇到的其他问题(例如模块化单体架构中的单独迁移)。
关于python - SQLAlchemy 和 DDD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51406836/