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