1

Supposons que j'ai la base de données GQL suivante,Compter le nombre de chaînes distinctes données par une requête dans GQL Python

class Signatories(db.Model): 
    name = db.StringProperty() 
    event = db.StringProperty() 

Cette base de données contient des informations sur les événements que les gens ont signé pour. Dites que j'ai les entrées suivantes dans la base de données au format (event_name, event_desc): (Bob, TestEvent), (Bob, TestEvent2), (Fred, TestEvent), (John, TestEvent). Mais le dilemme ici est que je ne peux pas agréger tous les événements de Bob en une seule entité parce que je voudrais demander à tous les gens inscrits pour un événement spécifique et aussi je voudrais ajouter ces entrées sans avoir à mettre à jour manuellement l'entrée à chaque fois.

Comment pourrais-je compter le nombre de chaînes distinctes données par une requête GQL en Python (dans mon exemple, j'essaie spécifiquement de voir combien de personnes sont actuellement inscrites à des événements)?

J'ai essayé d'utiliser l'ancien mcount = db.GqlQuery("SELECT name FROM Signatories").count(), mais cela renvoie bien sûr le nombre total de chaînes dans la liste, quel que soit le caractère unique de chaque chaîne.

J'ai également essayé d'utiliser count = len(member), où member = db.GqlQuery("SELECT name FROM Signatories"), mais malheureusement, cela ne renvoie qu'une erreur.

Répondre

1

Vous ne pouvez pas - au moins pas directement. (En passant, vous n'avez pas de base de données GQL).

Si vous avez un petit nombre d'éléments, puis les chercher dans la mémoire, et utiliser une opération de jeu pour produire l'ensemble unique puis compter

Si vous avez un plus grand nombre d'entités qui dans le filtrage de la mémoire et le comptage problématique alors votre stratégie sera d'agréger le compte que vous les créez,

par exemple

Créez une entité distincte chaque fois que vous créez un événement dont la paire de chaînes est la clé. De cette façon, vous n'aurez qu'une entité le magasin de données représentant la paire spécifique. Ensuite, vous pouvez faire un compte direct.

Cependant, comme vous obtenez un grand nombre de ces entités, vous devrez commencer à effectuer un travail supplémentaire pour les compter car l'unique query.count() deviendra trop cher. Vous devez ensuite commencer à examiner les stratégies de comptage à l'aide du magasin de données.

+0

Oh, j'ai utilisé le mauvais exemple en cas d'accident, donc je peux vous avoir induit en erreur. Je ne serais pas en mesure de faire ces listes agrégées (ou pourrais-je?). Serait-il possible de convertir ce que la requête crache en une liste, puis d'utiliser len() avec cela (ou est-ce impossible)? En tout cas, merci pour votre aide. – Diafotismos

+0

Bien sûr, vous pouvez faire une requête de projet et ne renvoyer que les deux champs qui vous intéressent. Ensuite, utilisez la compréhension de liste pour transformer le jeu de résultats dans l'ensemble de tuples, et vous aurez un ensemble de valeurs uniques que vous pouvez utiliser.) sur. –

+0

'len (set (nom i pour i dans db.GqlQuery (" SELECT nom FROM Signataires ")))' –