python - SQLAlchemy 和 DDD

标签 python sqlalchemy domain-driven-design

我正在使用 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 模型所需的工作量:

  1. 我不必从域-SQLAlchemy 编写映射代码,反之亦然
  2. 我可以“保证”我没有忘记在 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/

相关文章:

python - SQLAlchemy:返回按列的最大值过滤的记录

python - SQLAlchemy。类型错误 : filter_by() takes exactly 1 argument (2 given)

web-applications - 在 DDD 中,表示层可以同时使用 Repository 和 Service 类吗?

c# - 在域驱动设计的项目中,您将验证放在哪里?

python - Scikit 了解输出 **predict_proba** 和 **predict.** 的含义

python - 大于 x 时替换数组中的值

python - SQLAlchemy - 与额外列的自引用多对多关系

php - 谁应该处理复杂查询中的条件,数据映射器还是服务层?

python - 向后递归打印字符串,每次递增

Python导入困惑