MongoEngine中的经典映射

2024-06-01 00:51:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

对于MongoDB,尤其是在MongoEngine中,是否有类似的功能


Tags: 方法代码模型数据库sqlalchemy建模子类document
2条回答

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

MongoAlchemy的灵感来源于SQLAlchemy,它使用了session的概念,因此它可能更接近您所寻找的内容,但该项目不再维护

如果我理解正确,您正在尝试使用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

from model import User

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

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

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

相关问题 更多 >