web-dev-qa-db-fra.com

Comment interroger dans GQL en utilisant la clé d'entité

Comment écrire une requête sur la clé d'entité à l'aide de GQL dans la visionneuse de données Google App Engine?

Dans la visionneuse, la première colonne (Id/Nom) s'affiche comme name=_1, dans la vue de détail, il montre la clé comme

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

Cette requête ne fonctionne pas:

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

Vous pouvez utiliser la clé de l'entité pour la récupérer:

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

Et, vous devriez pouvoir interroger en utilisant le nom de la même manière:

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

Notez que ce n'est pas quelque chose que vous voudriez faire dans votre application AppEngine; comme le note Nick dans son commentaire, c'est une énorme perte de temps. Vraiment, cet exemple n'est utile que pour vous montrer comment interroger par clé dans la console d'administration.

105
Adam Crossland

Pour les ID numériques, un formulaire similaire à la requête par nom fonctionne:

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

J'ai trouvé ce formulaire particulièrement utile dans la console d'administration.

20
Jeffrey Miller

Vous n'avez pas besoin d'interroger pour obtenir une entité par clé - vous pouvez simplement récupérer l'entité par sa clé. En Python, vous pouvez le faire avec MyModel.get_by_key_name('_1'). C'est 3 à 5 fois plus rapide que la suggestion d'Adam d'utiliser une requête.

18
Nick Johnson

Lorsque vous interrogez par clé, vous devez faire correspondre la clé exactement, y compris le parent et pas seulement l'ID ou le nom. Bien sûr, si le parent est nul, comme dans l'exemple ci-dessus, l'ID ou le nom et le type d'entité sont suffisants.

Si vous avez la clé d'entité déjà encodée, vous pouvez simplement l'utiliser comme:

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

Pour l'exemple simple ci-dessus,

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

fera, mais si votre clé a un parent, comme

Paren: id=123

La requête serait alors

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

Si le parent lui-même a un parent, vous devez également l'ajouter. Pour plus de détails, consultez la documentation GQL officielle .

Il ne semble pas y avoir de moyen de tout sélectionner avec le même ID ou le même nom, quel que soit le parent.

2
aij

Juste une petite note à ce sujet: lorsque j'utilise des guillemets autour de l'un des arguments de KEY, l'appel échoue (dans la console d'administration, j'obtiens la fenêtre d'erreur).

Par exemple, pour le type "mon type" avec l'ID/le nom 12345, cela ne NE PAS travail:

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

Mais cela fait:

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