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

Posted

技术标签:

【中文标题】如何使用实体键在 GQL 中查询【英文标题】:How do I query in GQL using the entity key 【发布时间】:2011-01-01 04:03:56 【问题描述】:

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

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

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

此查询不起作用:

SELECT * FROM Programme where name = '_1'

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

啊,不。这是对时间和资源的巨大浪费。 @Nick:但在管理控制台中,可能没有更好的方法。 是否可以通过Id而不是Key进行查询? 当您只需要知道某物是否存在时,执行按键查询的计数操作绝对是找出实体是否存在的最快方法。如果需要获取密钥,可以对密钥查询进行计数,如果 > 0,则您已经知道密钥。如果您需要实体本身,请按照 nick 的建议进行操作,然后在实体上执行 get()。 记住,你只需要引用 id 是一个字符串。如果它是一个数字,你不应该引用它。因此,如果 id 是数值为 888 的数字,那么上面的查询将是 SELECT * FROM Program where key = KEY('Programme', 888)【参考方案2】:

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

【讨论】:

这不是我的建议,尼克,我只是想帮助他完成查询。我认为他正在尝试在管理控制台数据查看器中查看内容。 @Nick+Adam:是的,我试图在管理控制台中查看一些数据。 作为记录,__key__ 查询实际上通常直接从实体表本身读取,而不是先索引然后实体表。所以在实践中,当数据存储将此查询编译为原始大表查找或扫描时,__key__ == 查询和get() 之间没有太大区别。当然,这是一个实现细节。在查找单个实体时使用get() 仍然是一种好习惯。 ryan,__key__ 查询永远不会从实体表中读取。它们从索引表中读取,包括除实体表之外的所有表;索引表都指向一个键,因此无论您使用什么索引来搜索,这就是您的键的来源。在 1.6.5 中,有投影查询以与键查询相同的价格实际读取键和匹配的索引数据... ...也就是说,您永远不必在实体表上争用。 @Ajax 交叉线。 ryan 正在讨论“SELECT * FROM Kind WHERE key = :1”形式的查询;您正在谈论“SELECT key FROM Kind ...”形式的查询。您对各自的查询类型都是正确的。【参考方案3】:

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

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

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

但这确实:

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

【讨论】:

【参考方案4】:

key 查询时,需要准确匹配 key,包括 parent 而不仅仅是 ID 或 name。当然,如果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')

如果父级本身有父级,您也需要添加它。更多详情请参阅official GQL documentation。

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

【讨论】:

【参考方案5】:

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

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

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

【讨论】:

以上是关于如何使用实体键在 GQL 中查询的主要内容,如果未能解决你的问题,请参考以下文章

GQL:查找包含子字符串的所有实体

如何在gql查询中添加参数

谷歌应用引擎 GQL,如何以毫秒精度使用日期时间进行分页

如何在 Apollo Client 的 gql 查询中定义类型?

使用 Apollo gql 编写 WHERE GraphQL 查询

如何使用 GQL 从 React 前端的 Apollo 客户端获取错误