2010-09-01 2 views
8

Je souhaite être en mesure de vérifier si un nom-clé existe pour mon modèle dans le magasin de données. Mon code va:Comment vérifier si la clé existe dans la banque de données sans renvoyer l'objet

t=MyModel.get_by_key_name(c) 
    if t==None: 
     #key_name does not exist 

Je ne ai pas besoin de l'objet, donc il est un moyen (ce qui serait plus rapide et moins coûteux ressources) pour vérifier si l'objet existe sans le retourner? Je ne connais que le nom de la clé, pas la clé.

+2

La seule amélioration (principalement un style) consiste à utiliser «if t is None» pour la vérification. Sinon, comme d'autres réponses le disent, il n'y a pas de moyen plus rapide ou moins coûteux (ou du moins aucun qui soit propre, documenté et compatible avec l'avenir) et même les plus sales trucs non documentés vous achèteraient des gains difficilement mesurables. L'aller-retour au magasin dominera quand même, pas le coût de transfert de ce que j'imagine être au plus quelques paquets de données [[si j'imagine mal, ça vaut la peine de refactoriser vos modèles ;-)]]). –

Répondre

4

Vous ne pouvez pas éviter get_by_key_name() ou des équivalents liés aux clés pour vérifier si une clé existe. Votre code est correct.

1

Les pourparlers de l'API sur Model.all(keys_only=False) retourner tous les noms clés quand est keys_only la valeur True

Regardez la requête qui est renvoyé pour cela, et vous pouvez écrire une requête similaire à cela, mais juste pour votre objet et voir si une ligne est récupérée ou non.

+4

Une requête n'est pas une meilleure option, même avec keys_only. Ils sont beaucoup plus lents que d'avoir des clés. La seule amélioration des performances consisterait à utiliser des API de stockage de données de bas niveau, mais je ne le recommanderais pas car il est plus complexe et plus difficile à gérer. – moraes

+1

S'il vous plaît corrigez-moi si je me trompe depuis toutes ces pensées de la trentaine de minutes que j'ai passé à lire http: //code.google.com/appengine/docs/python/datastore/modelclass.html sans connaissances préalables ou une recherche plus approfondie: A La requête qui récupère le nom_clé est plus rapide que la récupération de l'objet pour voir si la clé existe. De plus, get_by_key_name() déclenche finalement une requête pour récupérer l'objet s'il existe. Les méthodes key_exists() devraient faire partie de l'API. Je lui ai juste suggéré un moyen de le faire. – Rahul

+4

datastore.Get et datastore.Query sont des choses différentes. get_by_key_name() n'effectue pas de requête - il construit une clé et utilise datastore.Get à la fin, ce qui est quelques fois plus rapide qu'un datastore.Query, même s'il s'agit d'une requête keys_only. Voir la latence de get et de requête: http://code.google.com/status/appengine/detail/datastore/2010/08/31#ae-trust-detail-datastore-get-latency – moraes

Questions connexes