【问题标题】:Is ndb.put_multi atomic?ndb.put_multi 是原子的吗?
【发布时间】:2019-07-03 11:13:01
【问题描述】:

例如,我有一个实体列表。其中之一无效。我打电话给ndb.put_multi(entities_to_put)

应该将其中的一些放在列表中然后抛出错误,还是根本不放置任何一个?

【问题讨论】:

    标签: python python-2.7 google-app-engine atomic app-engine-ndb


    【解决方案1】:

    put_multi 对于所有被放置的实体要么成功要么失败。 put_multi 的实现本质上只是对每个实体调用 put 的循环;没有用于隔离单个故障的异常处理。

    这段代码演示了这种行为:

    class Foo(ndb.Model):
    
        bar = ndb.IntegerProperty()
    
        def _pre_put_hook(self):
            # Trigger an exception during save.
            if self.bar > 10:
                raise ValueError('%d is too big' % self.bar)
    
    # Clear any existing foos
    existing = Foo.query().fetch(keys_only=True)
    ndb.delete_multi(existing)
    
    # Instantiate new foos
    vals = [0, 1, 20, 3, 4]
    foos = [Foo(bar=val) for val in vals]
    
    # Save new foos
    try:
        ndb.put_multi(foos)
    except ValueError as ex:
        print 'Exception raised during save: %s' % ex
    
    saved_foos = Foo.query().fetch()
    print 'Saved foos:', saved_foos
    
    # Output
    Exception raised during save: 20 is too big
    Saved foos: []
    

    【讨论】:

      猜你喜欢
      • 2011-03-03
      • 2010-12-11
      • 2020-05-07
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多