如何使用实体密钥在GQL中查询

时间:2010-01-04 07:52:26

标签: google-app-engine google-cloud-datastore gql

如何在Google App Engine数据查看器中使用GQL针对实体密钥编写查询?

在查看器中,第一列(ID /名称)显示为name=_1,在详细视图中,它将键显示为

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

此查询不起作用:

SELECT * FROM Programme where name = '_1'

5 个答案:

答案 0 :(得分:105)

您可以使用实体的密钥来检索它:

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

并且,您应该能够使用类似的名称进行查询:

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

请注意,这不是您希望在AppEngine应用程序中执行的操作;尼克在评论中指出,这是浪费大量时间。实际上,此示例仅向您展示如何在管理控制台中按键进行查询。

答案 1 :(得分:20)

对于数字ID,类似于逐个查询的表单起作用:

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

我发现此表单在管理控制台中特别有用。

答案 2 :(得分:18)

您根本不需要查询按键获取实体 - 您只需通过其键获取实体即可。在Python中,您可以使用MyModel.get_by_key_name('_1')执行此操作。这比Adam建议使用查询快3到5倍。

答案 3 :(得分:2)

按键查询时,您需要准确匹配密钥,包括父密钥,而不仅仅是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')

如果父母本身有父母,您也需要添加父母。有关详细信息,请参阅official GQL documentation

似乎没有办法选择具有相同ID或名称的所有内容,无论父级如何。

答案 4 :(得分:1)

快速注意一下:当我在KEY中的任何args周围使用任何引号时,调用失败(在管理控制台中我得到错误弹出窗口)。

例如,对于带有ID / Name 12345的“mytype”类型,这样做 NOT 工作:

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

但这样做:

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