2010-03-30 6 views
1

Lorsque quelqu'un s'inscrit à mon site Web, il doit s'inscrire avec un nom d'utilisateur unique. Mon pseudo-code actuel pour cela est:Comment puis-je implémenter une vérification de la disponibilité du nom d'utilisateur sur le moteur de l'application google?

if(datastore.nameIsAvailable(name)){ 
    datastore.createUser(name); 
} 

Comment puis-je faire en sorte que entre le moment où nameIsAvailable renvoie true, et la createUser est terminée, une autre instance de mon application ne crée pas un utilisateur avec le même nom ?

Répondre

2

Vous pouvez faire une requête pour le nom:

appuser = AppUser.all().filter('name =', name).get() 
if appuser: 
    # user already has this name 
else: 
    # it's all yours! 

... ou mieux encore que le nom de l'utilisateur soit le key_name pour votre AppUser:

appuser = AppUser.get_by_key(name) 
if appuser: 
    # user already has this name 
else: 
    # it's all yours! 

... et encore mieux :

appuser = AppUser.get_or_insert(name) 
# appuser is now either the existing user with this name, 
# or a new user with this name! 

Votre nom étant le nom_clé de l'entité signifie qu'il sera toujours et pour toujours unique, et en recherchant un utilisateur par leur nom sera aussi rapide que possible.

(Ceci est en supposant que vous utilisez Python, sinon, je peux ajouter un exemple Java, mais l'idée est la même)

+0

mais ce qui empêche le problème de la concurrence de 2 cas en cours d'exécution du code en même temps , et les deux instances voient le nom comme disponible car la validation de la banque de données ne s'est pas produite avant les deux instances appelées "AppUser.get_by_key (name)"? – Kyle

+2

Si vous souhaitez vérifier la disponibilité et prendre le nom s'il est disponible, vous pouvez exécuter les deux requêtes dans une transaction. C'est ce que fait get_or_insert (name): http://www.google.com/codesearch/p?hl=fr#Qx8E-7HUBTk/trunk/google/appengine/ext/db/__init__.py&q=get_or_insert%20package:http: //googleappengine%5C.googlecode%5C.com&sa=N&cd=1&ct=rc&l=870 –

+1

Je pense que vous devriez mentionner que les deux premières options ne sont pas sûres. La question concerne spécifiquement la concurence. –

Questions connexes