Appengine ndb - 如何确保没有祖先的唯一用户名和电子邮件?
Appengine ndb - How to ensure unique username and email without ancestors?
在我的 Appengine(使用 ndb)应用程序中,我存储用户并且用户名和电子邮件都必须是唯一的。
我还需要能够更新进度(如果高于以前存储的级别,则保存级别)、更改电子邮件和密码以及删除帐户。
我注意到在事务中没有祖先是不可能查询的。但是创建祖先并不是一个解决方案,因为这会将写入次数限制为每秒 1 次,如果应用程序变得流行,这就不行了。所以我需要另一个解决方案。
Key可以使用吗?是的,但这只会使用户名独一无二,我如何确保没有人将电子邮件重复用于另一个帐户?
您应该能够为此使用跨组交易以及仅用于保留电子邮件地址的实体。
对于您的 User
实体,您可以使用用户名作为键名。创建用户时,您还会创建一个 EmailReservation
实体,该实体将用户的电子邮件地址作为键名。
然后您使用跨组交易创建新用户:
@ndb.transactional(xg=True)
def create_user(user_name, email):
user = User.get_by_id(user_name)
email_reservation = EmailReservation.get_by_id(email)
if user or email_reservation:
# Either the user_name or email is already in use so stop
return None
# Create the user and reserve the email address so others can't use it
user = User(id=user_name)
email_reservation = EmailReservation(id=email)
ndb.put_multi(user, email_reservation)
return user
在我的 Appengine(使用 ndb)应用程序中,我存储用户并且用户名和电子邮件都必须是唯一的。 我还需要能够更新进度(如果高于以前存储的级别,则保存级别)、更改电子邮件和密码以及删除帐户。
我注意到在事务中没有祖先是不可能查询的。但是创建祖先并不是一个解决方案,因为这会将写入次数限制为每秒 1 次,如果应用程序变得流行,这就不行了。所以我需要另一个解决方案。
Key可以使用吗?是的,但这只会使用户名独一无二,我如何确保没有人将电子邮件重复用于另一个帐户?
您应该能够为此使用跨组交易以及仅用于保留电子邮件地址的实体。
对于您的 User
实体,您可以使用用户名作为键名。创建用户时,您还会创建一个 EmailReservation
实体,该实体将用户的电子邮件地址作为键名。
然后您使用跨组交易创建新用户:
@ndb.transactional(xg=True)
def create_user(user_name, email):
user = User.get_by_id(user_name)
email_reservation = EmailReservation.get_by_id(email)
if user or email_reservation:
# Either the user_name or email is already in use so stop
return None
# Create the user and reserve the email address so others can't use it
user = User(id=user_name)
email_reservation = EmailReservation(id=email)
ndb.put_multi(user, email_reservation)
return user