Question

Je suis dans une situation où j'ai besoin d'étendre les relations d'entité Google App Engine dans une requête telle que dans le modèle de base de données Django . J'utilise ListProperty s pour les relations un à plusieurs, comme suit:

class Foo(db.Model): bars = db.ListProperty(db.Key)
class Bar(db.Model): eggs = db.ListProperty(db.Key)

Et j'aimerais effectuer une requête qui effectue les opérations suivantes:

# Foo.filter('bars.eggs =', target_egg)
[foo
for egg in eggs if egg == target_egg
for eggs in bar.eggs
for bar in foo.bars
for foo in Foo.all()]

La compréhension semble radicalement inefficace. J'aimerais vraiment effectuer une requête comme dans la partie commentée, mais cela ne ressemble pas à la syntaxe GQL permet d'effectuer des requêtes sur les attributs des attributs:

   SELECT * FROM <kind>
    [WHERE <condition> [AND <condition> ...]]
    [ORDER BY <property> [ASC | DESC] [, <property> [ASC | DESC] ...]]
    [LIMIT [<offset>,]<count>]
    [OFFSET <offset>]

  <condition> := <property> {< | <= | > | >= | = | != } <value>
  <condition> := <property> IN <list>
  <condition> := ANCESTOR IS <entity or key>
Était-ce utile?

La solution

Vous avez raison, le magasin de données App Engine n'autorise pas ce type de requête. Et vous avez raison de dire que la compréhension de la liste est inefficace. Cependant, considérez que c'est exactement ce que fait une base de données relationnelle lorsque vous exécutez une requête avec des jointures comme la vôtre - la base de données doit effectuer le même travail O (n ^ 3) que vous faites ici - la seule différence est que vous le faites en Python, et avec un temps aller-retour supplémentaire. Étant donné que App Engine est conçu pour être évolutif, ce n'est pas vraiment fait pour ce type de requêtes.

Habituellement, il existe un moyen de dénormaliser votre modèle pour faciliter cela en déplaçant certaines des propriétés dont vous avez besoin d'accéder sur le modèle Foo ou, si vous effectuez des agrégats, en déplaçant le total sur le modèle Foo. modèle. Il est difficile de donner des solutions concrètes sans avoir une idée plus précise du problème que vous essayez de résoudre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top