2010-08-30 11 views
1

Comment implémenter ce compteur de requête dans une classe existante? Le but principal est d'avoir un modèle de banque de données de membres avec plus de 3000 enregistrements. Je veux juste compter son enregistrement total, et trouvé cela sur Cookbook moteur app:GAE Query counter (+1000)

def query_counter (q, cursor=None, limit=500): 
    if cursor: 
     q.with_cursor (cursor) 
    count = q.count (limit=limit) 
    if count == limit: 
     return count + query_counter (q, q.cursor(), limit=limit) 
    return count 

Mon modèle existant est:

class Members(search.SearchableModel): 
    group = db.ListProperty(db.Key,default=[]) 
    email = db.EmailProperty() 
    name = db.TextProperty() 
    gender = db.StringProperty() 

De plus, je veux compter les membres qui se joignent à certains groupes de référence de liste. Il pourrait également contenir plus de 1000 enregistrements.

Quelqu'un at-il une expérience avec query.cursor à cet effet?

+0

Que demandez-vous exactement? Comment utiliser ce code dans une classe Model que vous avez déjà écrite? –

+0

Oui, il existe des modèles à compter. –

Répondre

2

Pour trouver tous les membres que vous l'utiliser comme ceci:

num_members = query_counter(Members.all()) 

Cependant, vous pouvez constater que cela va lentement, parce que ça fait beaucoup d'appels de datastore. Un moyen plus rapide serait d'avoir une classe de modèle séparée (par exemple MembersCount), et de maintenir le compte là-dedans (par exemple ajouter 1 lorsque vous créez un membre, soustraire 1 lorsque vous supprimez un membre).

Si vous créez et la suppression de membres souvent vous devrez peut-être créer un compteur fragmentées afin d'obtenir de bonnes performances - voir ici pour plus de détails:

http://code.google.com/appengine/articles/sharding_counters.html

Pour compter les membres d'un certain groupe, vous pourrait faire quelque chose comme ceci:

group = ... 
num_members = query_counter(Members.all().filter('group =', group.key())) 

Si vous attendez d'avoir un grand nombre de membres dans un groupe, vous pouvez aussi le faire de manière plus efficace en utilisant un modèle de compteur qui est par le groupe fragmentées.

+0

Peut-être que je peux l'utiliser sur le nombre initial de membres, alors je peux maintenir le cercle de compte suivant avec des compteurs de sharding, Merci Saxon. –