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