SQLAlchemy和DDD

时间:2018-07-18 16:23:46

标签: 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. 我不必从domain-SQLAlchemy编写映射代码,反之亦然
  2. 我可以“保证”我没有忘记在SQLAlchemy副本中包含来自域的任何属性(在更改域模型时)。

1 个答案:

答案 0 :(得分:1)

如果我正确理解,您希望有两种实现聚合DTO的方法,而无需将sqlalchemy表映射到python数据结构。在这种情况下,我建议您创建UserDTO接口,该接口将由SQLAlchemy Model和纯域实现(用于测试?)实现。

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映射到数据库以及有关实现方法的策略。另外,我在这篇文章Persistency of DDD aggregate

中写了更多内容

希望它会帮助您解决DDD的其他问题(例如,模块化整体式体系结构中的单独迁移)。