web-dev-qa-db-ja.com

エンティティキーを使用してGQLでクエリする方法

Google App Engine Data ViewerでGQLを使用してエンティティキーに対するクエリを作成するにはどうすればよいですか?

ビューアーでは、最初の列(Id/Name)はname=_1、詳細ビューではキーが次のように表示されます。

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

このクエリは機能しません:

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

エンティティのキ​​ーを使用して取得できます:

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

また、同様の名前を使用してクエリを実行できるはずです。

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

これは、AppEngineアプリケーションで行いたいことではないことに注意してください。ニックがコメントで指摘しているように、それは時間の浪費です。実際、この例は、管理コンソールでキーでクエリを実行する方法を示すのに適しています。

105
Adam Crossland

数値IDの場合、名前によるクエリに似たフォームが機能します。

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

このフォームは、管理コンソールで特に役立ちました。

20
Jeffrey Miller

キーでエンティティを取得するためにクエリする必要はありません-キーでエンティティを取得するだけです。 Pythonでは、MyModel.get_by_key_name('_1')を使用してこれを行うことができます。これは、クエリを使用するというAdamの提案よりも3〜5倍高速です。

18
Nick Johnson

キーでクエリを実行する場合は、IDまたは名前だけでなく、親も含めてキーを正確に一致させる必要があります。もちろん、上記の例のように、親がnullの場合、エンティティのIDまたは名前とタイプで十分です。

既にエンコードされたエンティティキーがある場合は、次のように使用できます。

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

上記の簡単な例では、

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

ただし、キーに親がいる場合は、

Paren: id=123

クエリは次のようになります

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

親自体に親がある場合は、それも追加する必要があります。詳細については、 公式GQLドキュメント を参照してください。

親に関係なく、同じIDまたは名前を持つすべてを選択する方法はないようです。

2
aij

これに関する簡単なメモ:KEYの引数のいずれかを引用符で囲むと、呼び出しが失敗します(管理コンソールでエラーポップアップが表示されます)。

たとえば、ID/Name 12345のタイプ「mytype」の場合、これは ない 作業:

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

しかし、これは:

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