Appengine ndb - 如何确保没有祖先的唯一用户名和电子邮件?

时间:2017-01-01 02:29:56

标签: google-app-engine app-engine-ndb

在我的Appengine(使用ndb)应用程序中,我存储用户,用户名和电子邮件都必须是唯一的。 我还需要能够更新进度(如果高于先前存储的级别,则保存级别),更改电子邮件和pw以及删除帐户。

我注意到在事务中没有祖先的情况下无法进行查询。但创建一个祖先不是一个解决方案,因为这会将写入次数限制为每秒1次,如果应用程序受欢迎则不行。所以我需要另一种解决方案。

是否可以使用密钥?是的,但这只会使用户名独一无二,如何确保没有人将该电子邮件重新用于其他帐户?

1 个答案:

答案 0 :(得分:2)

您应该可以使用跨群组交易以及仅用于保留电子邮件地址的实体。

对于您的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