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'
エンティティのキーを使用して取得できます:
SELECT * FROM Programme where __key__ = KEY('agtzcG9...................')
また、同様の名前を使用してクエリを実行できるはずです。
SELECT * FROM Programme where __key__ = KEY(Programme, '_1')
これは、AppEngineアプリケーションで行いたいことではないことに注意してください。ニックがコメントで指摘しているように、それは時間の浪費です。実際、この例は、管理コンソールでキーでクエリを実行する方法を示すのに適しています。
数値IDの場合、名前によるクエリに似たフォームが機能します。
SELECT * from Programme where __key__ = KEY('Programme', 1234567)
このフォームは、管理コンソールで特に役立ちました。
キーでエンティティを取得するためにクエリする必要はありません-キーでエンティティを取得するだけです。 Pythonでは、MyModel.get_by_key_name('_1')
を使用してこれを行うことができます。これは、クエリを使用するというAdamの提案よりも3〜5倍高速です。
キーでクエリを実行する場合は、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または名前を持つすべてを選択する方法はないようです。
これに関する簡単なメモ:KEYの引数のいずれかを引用符で囲むと、呼び出しが失敗します(管理コンソールでエラーポップアップが表示されます)。
たとえば、ID/Name 12345のタイプ「mytype」の場合、これは ない 作業:
SELECT * FROM mytype WHERE __key__ = KEY('mytype', '12345')
しかし、これは:
SELECT * FROM mytype WHERE __key__ = KEY(mytype, 12345)