Является ли ndb.put_multi атомарным? - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть список объектов, например.Один из них недействителен.Я звоню ndb.put_multi(entities_to_put).

Должен ли он поместить некоторые из них в список и затем выдать ошибку, или он вообще не должен помещать ни одного из них?

1 Ответ

0 голосов
/ 10 февраля 2019

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