我有相当丰富的PHP和c#开发经验,我正在考虑学习python。我想练习数据存储和检索,当我看到大多数python ORM是如何处理模型层的时候,我哭了。
在python ORM中,模型实体做很多工作似乎是很正常的--它不仅是一个数据容器(我认为它应该是这样的),而且对于某些库来说,它还持有数据库连接(peewee -是的,您可以使用没有数据库的实体并在以后绑定它,但您仍然必须使用该实体进行数据检索……)或者具有它们从其继承的一些公共元数据对象(declarative_base in SQLalchemy)。在某些库中,entity类用于data retrieval、filtering、storage或deletion。在django-orm、tortoise-orm、pony-orm等其他ORM库中也可以看到类似的概念。
这赋予了实体类太多的责任,并将实体(以及整个数据服务层)与特定的库实现绑定在一起。它还打破了单一责任原则,概念分离,使测试变得更加困难,使依赖注入变得非常不可用,可能还有许多其他我现在无法想到的事情。尽管上面提到的库通常都很好,可以做你需要的所有事情,但我还是不能接受这个基本的东西……
我希望看到一些管理器/数据服务层,负责数据存储和检索。实体将是非常普通的对象,对数据库层一无所知(比如sqlite-net或doctrine实体)。在python中有这样的东西吗?为什么这样的(反)模式在python库中如此常见?
谢谢
发布于 2020-07-07 21:27:27
peewee的作者在这里。正如您所注意到的,Peewee有一个查询构建器API,它没有耦合到底层数据库连接,但这仅仅是构建更紧密耦合的模型层的基础。据我所知,99.99%的人都在使用它。对我来说,我关注的是:我在这里尝试做什么,以及我如何用最少的样板或配置尽可能简单地完成它。这遵循80-20规则(尽管对于Peewee用户来说,它可能更接近99-1),其中暴露的API与用户试图做的事情完全一致。从我收到的反馈来看,似乎其他人也有类似的目标,并且喜欢Peewee的简单。
https://stackoverflow.com/questions/62770329
复制相似问题