Wie frage ich in GQL mit dem Entitätsschlüssel ab?

72

Wie schreibe ich eine Abfrage für den Entitätsschlüssel mithilfe von GQL im Google App Engine Data Viewer?

Im Viewer wird die erste Spalte (ID / Name) als angezeigt name=_1, in der Detailansicht wird der Schlüssel als angezeigt

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

Diese Abfrage funktioniert nicht:

SELECT * FROM Programme where name = '_1'
Thilo
quelle

Antworten:

106

Sie können den Schlüssel der Entität verwenden, um ihn abzurufen:

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

Und Sie sollten in der Lage sein, mit dem Namen ähnlich abzufragen:

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

Beachten Sie, dass Sie dies in Ihrer AppEngine-Anwendung nicht tun möchten. Wie Nick in seinem Kommentar bemerkt, ist es eine enorme Zeitverschwendung. Dieses Beispiel zeigt nur, wie Sie in der Admin-Konsole nach Schlüssel abfragen.

Adam Crossland
quelle
4
Argh, nein. Dies ist eine enorme Zeit- und Ressourcenverschwendung.
Nick Johnson
4
@Nick: aber in der Admin-Konsole gibt es wahrscheinlich keinen besseren Weg.
Thilo
4
Ist es möglich, nach ID anstelle von Schlüssel abzufragen?
Tensaix2j
Wenn Sie nur wissen müssen, ob etwas vorhanden ist oder nicht, ist das Ausführen einer Zähloperation für eine Abfrage nach Schlüssel der absolut schnellste Weg, um herauszufinden, ob eine Entität vorhanden ist. Wenn Sie einen Schlüssel abrufen müssen, können Sie eine Schlüsselabfrage zählen. Wenn> 0, kennen Sie den Schlüssel bereits. Wenn Sie die Entität selbst benötigen, tun Sie einfach, was Nick empfiehlt, und führen Sie get () für die Entität aus.
Ajax
Denken Sie daran, dass Sie nur die ID angeben müssen, wenn es sich um eine Zeichenfolge handelt. Wenn es sich um eine Zahl handelt, sollten Sie sie nicht zitieren. Wenn die ID also numerisch mit einem Wert von 888 wäre, wäre die obige Abfrage SELECT * FROM Program, wobei key = KEY ('Program', 888)
Ezward
20

Bei numerischen IDs funktioniert ein Formular ähnlich der Abfrage nach Namen:

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

Ich fand dieses Formular besonders nützlich in der Admin-Konsole.

Jeffrey Miller
quelle
18

Sie müssen keine Abfrage durchführen, um eine Entität nach Schlüssel zu erhalten. Sie können die Entität einfach anhand ihres Schlüssels abrufen. In Python können Sie dies mit tun MyModel.get_by_key_name('_1'). Dies ist drei- bis fünfmal schneller als Adams Vorschlag, eine Abfrage zu verwenden.

Nick Johnson
quelle
5
Es war nicht mein Vorschlag, Nick, ich habe nur versucht, ihm zu helfen, dass seine Abfrage funktioniert. Ich denke, dass er versucht, Dinge in der Datenanzeige der Administratorkonsole anzuzeigen.
Adam Crossland
@ Nick + Adam: Ja, ich habe versucht, einige Daten in der Admin-Konsole zu überprüfen.
Thilo
1
Für den Datensatz werden __key__Abfragen im Allgemeinen direkt aus der Entitätstabelle selbst gelesen, anstatt zuerst aus den Indizes und dann aus der Entitätstabelle. In der Praxis gibt es also keinen großen Unterschied zwischen einer __key__ ==Abfrage und einer Abfrage , wenn der Datenspeicher diese Abfrage zu einer rohen bigtable-Suche oder einem Scan zusammenstellt get(). Dies ist natürlich ein Implementierungsdetail. Es ist immer noch eine gute Vorgehensweise, get()wenn Sie eine einzelne Entität suchen.
Ryan
Ryan, die __key__Abfragen werden niemals aus der Entitätstabelle gelesen. Sie lesen aus Indextabellen, die alle Tabellen außer der Entitätstabelle enthalten. Die Indextabellen zeigen alle auf einen Schlüssel. Unabhängig davon, welchen Index Sie für die Suche verwenden, stammt Ihr Schlüssel daher. In 1.6.5 gibt es Projektionsabfragen, um den Schlüssel und die übereinstimmenden Indexdaten zum gleichen Preis wie eine Schlüsselabfrage zu lesen ... ... nämlich, dass Sie die Entitätstabelle niemals in Konflikt bringen müssen.
Ajax
1
@ Ajax Gekreuzte Drähte. Ryan spricht von Abfragen der Form "SELECT * FROM Kind WHERE key =: 1"; Sie sprechen von Abfragen der Form "SELECT key FROM Kind ...". Sie haben beide Recht mit Ihren jeweiligen Abfragetypen.
Nick Johnson
2

Bei der Abfrage nach Schlüssel müssen Sie genau mit dem Schlüssel übereinstimmen, einschließlich des übergeordneten Schlüssels und nicht nur der ID oder des Namens. Wenn das übergeordnete Element wie im obigen Beispiel null ist, reichen natürlich die ID oder der Name und der Entitätstyp aus.

Wenn Sie den bereits codierten Entitätsschlüssel haben, können Sie diesen wie folgt verwenden:

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

Für das einfache Beispiel oben

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

wird tun, aber wenn Ihr Schlüssel ein Elternteil hat, wie

Paren: id=123

Dann wäre die Abfrage

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

Wenn der Elternteil selbst einen Elternteil hat, müssen Sie diesen ebenfalls hinzufügen. Weitere Informationen finden Sie in der offiziellen GQL-Dokumentation .

Es scheint keine Möglichkeit zu geben, unabhängig vom Elternteil alles mit derselben ID oder demselben Namen auszuwählen.

aij
quelle
1

Nur eine kurze Anmerkung dazu: Wenn ich Anführungszeichen um eines der Argumente in KEY verwende, schlägt der Aufruf fehl (in der Administratorkonsole wird das Fehler-Popup angezeigt).

Für den Typ "mytype" mit der ID / dem Namen 12345 funktioniert dies beispielsweise NICHT :

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

Aber das tut:

SELECT * FROM mytype WHERE __key__ = KEY(mytype, 12345)
Tim Consolazio
quelle