一个朋友最近向我展示了你可以创建一个实例,它是Python中dict的子类,然后使用该实例来保存、更新等。似乎你有更多的控制,看起来也更容易。
class Marker(dict):
def __init__(self, username, email=None):
self.username = username
if email:
self.email = email
@property
def username(self):
return self.get('username')
@username.setter
def username(self, val):
self['username'] = val
def save(self):
db.collection.save(self)
作者在此。您想要使用它(或许多类似库中的一个)的一般原因是为了安全。当你给一个MongoAlchemy文档赋值时,它会做一个检查,以确保你指定的所有约束都得到满足(例如类型,字符串长度,数字边界)。
它还有一个查询DSL,使用起来比类似json的内置语法更舒适。下面是文档中的一个示例:
>>> query = session.query(BloodDonor)
>>> for donor in query.filter(BloodDonor.first_name == 'Jeff', BloodDonor.age < 30):
>>> print donor
Jeff Jenkins (male; Age: 28; Type: O+)
MongoAlchemy Session对象也允许你模拟事务:
with session:
do_stuff()
session.insert(doc1)
do_more_stuff()
session.insert(doc2)
do_even_more_stuff()
session.insert(doc3)
# note that at this point nothing has been inserted
# now things are inserted
这并不意味着这些插入是一个原子操作——或者甚至所有的写入都将成功——但它确实意味着,如果您的应用程序在"do_stuff"函数中有错误,那么您将没有完成一半的插入。因此它可以防止一种特定的,相当常见的错误