既然可以子类化Python字典,为什么还要使用MongoAlchemy呢?



一个朋友最近向我展示了你可以创建一个实例,它是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"函数中有错误,那么您将没有完成一半的插入。因此它可以防止一种特定的,相当常见的错误

最新更新