在Pyramid中使用mongoengine ORM通过pymongo插入数据

1 投票
1 回答
1225 浏览
提问于 2025-04-17 18:39

我想用pymongo来连接和操作mongodb,但同时也想使用mongoengine这个ORM工具。

举个例子:

class User(Document):
    email = StringField(required=True)
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)

john = User(email='jonhd@example.com')
john.first_name = 'Jonh'
john.last_name = 'Hope'

现在我想把新创建的用户文档插入到我的'test_collection'里。如果只用mongoengine的话,我可以这样做:

connect('test_database')
john.save()

然后我可以很方便地访问我的数据:

for user in User.objects:
    print user.first_name 

但是当我尝试用pymongo做同样的事情时,我遇到了一个错误:

connection = MongoClient('localhost', 27017)
db = connection.test_database
collection = db.test_collection
collection.insert(john)

错误追踪信息:

Traceback (most recent call last):
File "C:/Users/haribo/PycharmProjects/test/mongoeng.py", line 18, in <module>
    collection.insert(john)
File "C:\Python27\lib\site-packages\pymongo\collection.py", line 353, in insert
    docs = [self.__database._fix_incoming(doc, self) for doc in docs]
File "C:\Python27\lib\site-packages\pymongo\database.py", line 258, in _fix_incoming
    son = manipulator.transform_incoming(son, collection)
File "C:\Python27\lib\site-packages\pymongo\son_manipulator.py", line 73, in transform_incoming
    son["_id"] = ObjectId()
TypeError: 'str' object does not support item assignment

不过这样是可以的:

connection = MongoClient('localhost', 27017)
db = connection.test_database
collection = db.test_collection
john = { 'email': 'jonhd@example.com', 'first_name': 'Jonh', 'last_name': 'Hope' }
collections.insert(john)    

用pymongo访问数据:

print collection.find_one()

{u'last_name': u'Hope', u'first_name': u'Jonh', u'_id': ObjectId('513d93a3ee1dc61390373640'), u'email': u'jonhd@example.com'}

所以,我的主要想法和问题是:

我该如何同时使用mongoengine作为ORM和pymongo的连接与方法来操作mongodb呢?

附注:我提到过我想在pyramid框架中使用它,给你一些背景信息。

1 个回答

0

Pymongo 是一个可以把 Python 字典(或者类似字典的对象)保存到 MongoDB 的工具。不过,Pymongo 不能直接处理 MongoEngine 类的实例,也就是说,它不能把这些实例保存到数据库里。

MongoEngine 是一个 ORM(对象关系映射)工具,它在底层使用了 Pymongo,并且在类的实例上有一个保存数据的方法,比如说:john.save()。在 MongoEngine 的代码里,它会把 john 这个实例中的数据转换成一个字典,然后通过 Pymongo 把这个字典存储到 MongoDB 中。

撰写回答