2017-01-01 7 views
2

私のAppengine(ndbを使って)アプリケーションで私はユーザーを保存しています。ユーザー名と電子メールの両方が一意である必要があります。 また、進捗状況(以前に保存されたレベルより高い場合はレベルを保存)を変更し、電子メールとPWを変更してアカウントを削除する必要があります。Appengine ndb - 祖先なしで一意のユーザー名と電子メールを確保する方法は?

トランザクションで祖先なしで照会することはできないことに気付きました。しかし、祖先を作成することは解決策ではありません。これは、書き込みが1秒あたり1回に制限されるためです。これは、アプリが普及すればOKではありません。だから私は別の解決策が必要です。

キーを使用することはできますか?はい、ただし、ユーザー名を一意にするだけです。他のアカウントの電子メールを再利用していないことを確認するにはどうすればよいですか?

答えて

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 
関連する問題