36

我想构建 GQL 查询以使用其数字 id 获取对象。我在应用程序管理控制台的数据存储查看器中执行此操作,因此无法使用 Model.get_by_id(numeric_id)。就像是

SELECT * FROM Model WHERE id = <numeric_id>

也不起作用。

4

5 回答 5

77

试试这个:

SELECT * FROM Model where __key__ = KEY('Model', <numeric_id>)
于 2010-10-06T06:27:57.283 回答
5

不幸的是,似乎没有办法编写相当于

SELECT * FROM Model WHERE id = <numeric_id>

这将选择具有给定 id 的所有模型实体。如果你对相当于

SELECT * FROM Model WHERE id = <numeric_id> AND parent IS NULL

你可以使用类似的东西

SELECT * FROM Model where __key__ = KEY('Model', <numeric_id>)

但是,如果您的实体确实有父级,则需要将其指定为键的一部分,例如

SELECT * FROM Model where __key__ = KEY('ParentModel', <parent_name_or_id>, 'Model', <numeric_id>)

如果父级本身有父级,您也需要指定它。(祖父母在父母的左边,依此类推。)

当然,如果您不限于 GQL(例如,如果您使用 Python、Go 或 Java),您可以查询键、解码它们并按 id 过滤,然后获取相应的实体。但当然,这在数据存储查看器中不起作用,因为您只能使用 GQL。

于 2014-07-04T18:04:49.840 回答
3

另一种方法是,首先使用 id 获取实体的密钥

key = db.Key.from_path('Model', int(id))

然后通过

obj = db.get(key)

优点是,您不必进行任何字符串格式化。

参考:本课程第 3 题,https://classroom.udacity.com/courses/cs253/

于 2016-05-19T08:30:15.343 回答
1

我收到了这个错误:

GQL 查询错误:在第 1 行第 42 列遇到 ...。期待以下之一:UNQUOTED_NAME ... QUOTED_NAME ..."

事实证明,在 Google AppEngine 数据存储开发人员的管理控制台中,您应该删除引号并使用如下内容:

SELECT * FROM MyEntity WHERE __key__ = Key(MyEntity, 5695872079757312)
于 2019-05-15T13:12:49.857 回答
0

就我而言,我必须将 ID 的类型从 String 更改为 Long

于 2014-05-20T06:57:22.303 回答