Cloud NDB:事务性 put() 多个实体

Cloud NDB: transactionally put() multiple entities

在某些情况下,我们必须同时保存两个或多个数据存储实体(要么保存两个实体,要么都不保存)。对于我的示例,我想在创建 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()

上面的函数不是原子的。有可能只有一个实体或两个实体都没有成功保存。

我怎样才能使它成为原子的?

ndb 中有 transactional 装饰器供您使用。如果任何记录无法保存,其中 none 将:

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()