Domanda

Sono in una situazione in cui ho bisogno di estendere le relazioni dell'entità di Google App Engine in una query come nel modello di database Django . Sto usando ListProperty per relazioni uno-a-molti, in questo modo:

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

E vorrei eseguire una query che procede come segue:

# 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 comprensione sembra radicalmente inefficiente. Mi piacerebbe davvero eseguire una query come nella parte commentata, ma non sembra la sintassi GQL consente di eseguire query sugli attributi degli attributi:

   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>
È stato utile?

Soluzione

Hai ragione, l'archivio dati di App Engine non consente questo tipo di query. E hai ragione che la comprensione dell'elenco è inefficiente. Considera, tuttavia, che è esattamente ciò che fa un database relazionale quando esegui una query con join come il tuo - il database deve eseguire lo stesso lavoro O (n ^ 3) che stai facendo qui - l'unica differenza è che lo stai facendo in Python e con un tempo di andata e ritorno aggiuntivo. Poiché App Engine è progettato per essere ridimensionato, non è realmente realizzato per questo tipo di query.

Di solito, però, c'è un modo per denormalizzare un po 'il tuo modello per facilitare questo, spostando alcune delle proprietà di cui hai bisogno per accedere al modello Foo, o se stai facendo aggregati, spostando il totale su Foo modello. Tuttavia, è difficile fornire soluzioni concrete senza avere più un'idea del problema che stai cercando di risolvere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top