是ndb.put_multi原子的吗?

时间:2019-02-09 10:51:01

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

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

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

1 个答案:

答案 0 :(得分:0)

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: []