如何在 GQL 中使用实体键进行查询

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

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

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

这个查询不起作用:

SELECT * FROM Programme where name = '_1'
36273 次浏览

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

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

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

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

请注意,这不是您希望在 AppEngine 应用程序中做的事情; 正如 Nick 在他的评论中指出的那样,这是对时间的巨大浪费。实际上,这个示例只能很好地向您展示如何在管理控制台中通过 Key 进行查询。

根本不需要查询就可以按键获取实体-只需按键获取实体即可。在 Python 中,可以使用 MyModel.get_by_key_name('_1')实现这一点。这比 Adam 建议的使用查询快3到5倍。

对于数字 ID,类似于按名称查询的表单可以工作:

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

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

按键查询时,需要精确匹配键,包括父键,而不仅仅是 ID 或名称。当然,如果父级为 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')

如果父元素本身有一个父元素,您也需要添加它。

似乎没有一种方法可以选择具有相同 ID 或名称的所有内容,而不管其父类是谁。

只是一个简单的注意: 当我在 KEY 中的任何参数周围使用任何引号时,调用失败(在管理控制台中,我得到了错误弹出窗口)。

例如,对于 ID/Name 为12345的“ mytype”类型,它执行 没有工作:

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

但这个可以:

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