2010-01-04 11 views
69

Come si scrive una query sulla chiave dell'entità utilizzando GQL nel Visualizzatore dati di Google App Engine?Come si esegue una query in GQL utilizzando la chiave entità

Nel visualizzatore, la prima colonna (ID/Name) viene visualizzato come name=_1, nella visualizzazione dettagliata mostra la chiave come

Decoded entity key: Programme: name=_1 
Entity key: agtzcG9................... 

Questa query non funziona:

SELECT * FROM Programme where name = '_1' 

risposta

103

È puoi utilizzare la chiave dell'entità per recuperarla:

SELECT * FROM Programme where __key__ = KEY('agtzcG9...................') 

E, dovresti essere in grado di eseguire una query utilizzando il nome simile:

SELECT * FROM Programme where __key__ = KEY(Programme, '_1') 

Si noti che questo non è qualcosa che si vorrebbe fare nella vostra applicazione AppEngine; come nota Nick nel suo commento, è un'enorme perdita di tempo. In realtà, questo esempio è utile solo per mostrarti come eseguire una query in base alla chiave nella Console di amministrazione.

+4

Argh, no. Questo è un enorme spreco di tempo e risorse. –

+4

@Nick: ma nella Console di amministrazione, probabilmente non esiste un modo migliore. – Thilo

+0

Mi dispiace, mio ​​errore. :/ –

18

Non è necessario eseguire una query per ottenere un'entità per chiave - è possibile semplicemente recuperare l'entità tramite la relativa chiave. In Python, puoi farlo con MyModel.get_by_key_name('_1'). Questo è da 3 a 5 volte più veloce del suggerimento di Adam di usare una query.

+5

Non era il mio suggerimento, Nick, stavo solo cercando di aiutarlo a far funzionare la sua query. Penso che stia cercando di visualizzare le cose nel visualizzatore dati della console di amministrazione. –

+0

@ Nick + Adam: sì, stavo cercando di rivedere alcuni dati nella console di amministrazione. – Thilo

+1

per il record, le query '__key__' in realtà vengono generalmente lette direttamente dalla tabella delle entità, invece degli indici prima e quindi della tabella delle entità. quindi, in pratica, quando il datastore compila questa query fino a una scansione bigtable o alla scansione, non c'è molta differenza tra una query '__key__ ==' e una 'get()'. ovviamente, questo è un dettaglio di implementazione. è comunque buona pratica usare 'get()' ogni volta che si cerca una singola entità. – ryan

20

Per ID numerici, una forma simile al nome di query-by-works:

SELECT * from Programme where __key__ = KEY('Programme', 1234567) 

Ho trovato questa forma particolarmente utile in Admin Console.

2

Quando si esegue una query per chiave, è necessario abbinare esattamente la chiave, incluso il genitore e non solo l'ID o il nome. Naturalmente, se il genitore è nullo, come nell'esempio precedente, l'ID o il nome e il tipo di entità sono sufficienti.

Se avete la chiave di entità già codificata, si può semplicemente utilizzare che, come:

SELECT * FROM Programme where __key__ = KEY('agtzcG9...................') 

Per il semplice esempio di cui sopra,

SELECT * FROM Programme where __key__ = KEY('Programme', '_1') 

farà, ma se il tasto ha un genitore , come

Paren: id=123 

Poi la query sarebbe

SELECT * FROM Programme where __key__ = KEY('Paren', 123, 'Programme', '_1') 

Se il genitore stesso ha un genitore, è necessario aggiungere anche questo. Per maggiori dettagli vedere lo official GQL documentation.

Non sembra essere un modo per selezionare tutto con lo stesso ID o nome indipendentemente dal genitore.

1

Solo una breve nota al riguardo: quando uso le virgolette su qualsiasi argomento in KEY, la chiamata fallisce (nella console di amministrazione viene visualizzato il messaggio di errore).

Ad esempio, per il tipo "mytype" con ID/Name 12345, che fa NON lavoro:

SELECT * FROM mytype WHERE __key__ = KEY('mytype', '12345') 

Ma questo fa:

SELECT * FROM mytype WHERE __key__ = KEY(mytype, 12345) 
Problemi correlati