74

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

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

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

此查询不起作用:

SELECT * FROM Programme where name = '_1'
4

5 回答 5

108

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

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

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

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

请注意,这不是您希望在 AppEngine 应用程序中执行的操作;正如尼克在他的评论中指出的那样,这是对时间的巨大浪费。真的,这个例子只是向您展示如何在管理控制台中按键查询。

于 2010-01-04T14:13:32.070 回答
20

对于数字 ID,类似于按名称查询的形式起作用:

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

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

于 2011-06-02T04:38:08.427 回答
18

您根本不需要查询来通过键获取实体 - 您可以简单地通过键获取实体。在 Python 中,您可以使用MyModel.get_by_key_name('_1'). 这比 Adam 建议的使用查询快 3 到 5 倍。

于 2010-01-06T21:38:27.137 回答
2

按键查询时,需要准确匹配键,包括父级,而不仅仅是ID或名称。当然,如果 parent 为 null,如上例,ID 或 Name 以及实体的类型就足够了。

如果你有已经编码的实体键,你可以像这样使用它:

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 或名称的所有内容。

于 2014-07-02T23:01:10.277 回答
1

关于这一点的快速说明:当我在 KEY 中的任何 args 周围使用任何引号时,调用失败(在管理控制台中我收到错误弹出窗口)。

例如,对于 ID/名称为 12345 的类型“mytype”,这不起作用

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

但这确实:

SELECT * FROM mytype WHERE __key__ = KEY(mytype, 12345)
于 2015-05-15T21:55:12.160 回答