【发布时间】:2019-07-03 11:13:01
【问题描述】:
例如,我有一个实体列表。其中之一无效。我打电话给ndb.put_multi(entities_to_put)。
应该将其中的一些放在列表中然后抛出错误,还是根本不放置任何一个?
【问题讨论】:
标签: python python-2.7 google-app-engine atomic app-engine-ndb
例如,我有一个实体列表。其中之一无效。我打电话给ndb.put_multi(entities_to_put)。
应该将其中的一些放在列表中然后抛出错误,还是根本不放置任何一个?
【问题讨论】:
标签: python python-2.7 google-app-engine atomic app-engine-ndb
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: []
【讨论】: