Python MongoEngine中的经典映射

Python MongoEngine中的经典映射,python,mongodb,sqlalchemy,pymongo,mongoengine,Python,Mongodb,Sqlalchemy,Pymongo,Mongoengine,我是MongoEngine的新手,看起来我们需要从MongoEngine创建类Document的子类来建模数据库。我有点担心,因为这违反了SOLID原则中的依赖倒置。因此,如果我以后需要使用另一个数据库,我将不得不更改我的域模型类,而我实际上不应该这样做 SQLAlchemy通过提供漂亮的。使用这种方法,依赖于数据库的代码从我的域模型中分离出来,因此我真的不需要担心数据库提供程序,如果需要更改数据库,我可以轻松地将细节提取出来 MongoDB是否也有类似的功能,最好是在MongoEngine中?

我是MongoEngine的新手,看起来我们需要从
MongoEngine
创建类
Document
的子类来建模数据库。我有点担心,因为这违反了SOLID原则中的依赖倒置。因此,如果我以后需要使用另一个数据库,我将不得不更改我的域模型类,而我实际上不应该这样做

SQLAlchemy通过提供漂亮的。使用这种方法,依赖于数据库的代码从我的域模型中分离出来,因此我真的不需要担心数据库提供程序,如果需要更改数据库,我可以轻松地将细节提取出来

MongoDB是否也有类似的功能,最好是在MongoEngine中?

Pymongo的官方提供了现有ORM/ODM和框架的列表,但据我所知,它们都实现了(就像django ORM),正如您所说,这违反了坚实的原则,但对于许多简单的用例来说已经足够了


MongoAlchemy的灵感来源于SQLAlchemy,它使用了一个概念,因此它可能更接近您要查找的内容,但项目已不再维护。

如果我理解正确,您正在尝试使用mongoengine将对象映射到文档模式

让我们为用户创建一个文档类:

from mongoengine import Document, StringField


class UserDocument(Document):
    username = StringField(required=True)
    password = StringField(required=True)
    email = StringField(required=True)
现在添加一个创建新用户的类方法:

from mongoengine import disconnect, connect, Document, StringField


class UserDocument(Document):
    username = StringField(required=True)
    password = StringField(required=True)
    email = StringField(required=True)

    @classmethod
    def new(cls):
        data = UserDocument(username=cls.username, password=cls.password, email=cls.email)
        connect('test_collection')
        data.save()
        disconnect('test_collection')
我理解您的问题,本例中您的问题是UserDocument可能知道mongoengine,因此违反了依赖倒置原则。这可以通过一个子类来解决

首先允许在UserDocument中继承:

...
class UserDocument(Document):
    meta = {'allow_inheritance': True}
    username = StringField(required=True)
    ...
接下来,我们构建孩子:

from user_document import UserDocument


# Maps object to schema
class User(UserDocument):
    def __init__(self, *args, **values):
        super().__init__(*args, **values)
接下来添加一个create方法:

from user_document import UserDocument


# Maps object to schema
class User(UserDocument):
    def __init__(self, *args, **values):
        super().__init__(*args, **values)

    def create(self, username, password, email):
        self.username, self.password, self.email = username, password, email
        User.new()
现在,我们的用户对象继承了UserDocument字段。可以直接或通过User.new()的子级访问UserDocument.new

用户对象知道UserDocument,而UserDocument又依赖于mongoengine

如果我误解或使用了不正确的词汇来描述示例解决方案,我深表歉意。我比较新,自学成才,没有朋友编写代码,这使得讨论变得困难

from model import User

    username, password, email = 'cool username', 'super secret password', 'mrcool@example.com'
    User.create(User, username, password, email)