Облако NDB: транзакционно положить () несколько объектов - PullRequest
0 голосов
/ 02 апреля 2020

Бывают ситуации, когда мы должны сохранить два или более объекта хранилища данных одновременно (либо оба объекта сохранены, либо ни один не сохранен). В моем примере я хочу создать сущность UserProfile при создании сущности User.

из сущностей, импортирующих User, UserProfile

def create_user_and_profile():
    # First, create the User entity
    user = User(email=email, password=password_hash)
    user.put()

    # Then, create a UserProfile entity
    # that takes a user.key as parent
    user_profile = UserProfile(parent=user.key)
    user_profile.put()

Приведенная выше функция не является atomi c. Возможно, что только один или ни один из объектов успешно сохранены.

Как я могу сделать этот атом c?

1 Ответ

0 голосов
/ 06 апреля 2020

есть transactional декоратор в ndb, который вы можете использовать. Если какая-либо из записей не будет сохранена, ни одна из них не будет:

from google.cloud import ndb


@ndb.transactional()
def create_user_and_profile():
    # First, create the User entity
    user = User(email=email, password=password_hash)
    user.put()

    # Then, create a UserProfile entity
    # that takes a user.key as parent
    user_profile = UserProfile(parent=user.key)
    user_profile.put()

with ndb_client.context(): # ndb client instance
    create_user_and_profile()
...