【发布时间】:2011-04-21 15:44:44
【问题描述】:
我想构建 GQL 查询以使用其数字 id 获取对象。我在应用程序管理控制台的数据存储查看器中执行此操作,所以我不能使用 Model.get_by_id(numeric_id)。类似的东西
SELECT * FROM Model WHERE id = <numeric_id>
也不行。
【问题讨论】:
标签: google-app-engine gql
我想构建 GQL 查询以使用其数字 id 获取对象。我在应用程序管理控制台的数据存储查看器中执行此操作,所以我不能使用 Model.get_by_id(numeric_id)。类似的东西
SELECT * FROM Model WHERE id = <numeric_id>
也不行。
【问题讨论】:
标签: google-app-engine gql
试试这个:
SELECT * FROM Model where __key__ = KEY('Model', <numeric_id>)
【讨论】:
不幸的是,似乎没有办法编写等效于
的查询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 过滤,然后获取相应的实体。当然,这在 Datastore Viewer 中不起作用,因为您只能使用 GQL。
【讨论】:
另一种方法是,首先使用 id by 获取实体的密钥
key = db.Key.from_path('Model', int(id))
然后通过
获取对象obj = db.get(key)
优点是,您不必进行任何字符串格式化。
【讨论】:
from_path 之后,这是一个语法错误。否则它可以工作
我收到了这个错误:
GQL 查询错误:在第 1 行第 42 列遇到 ...。期待 之一:UNQUOTED_NAME ... QUOTED_NAME ..."
事实证明,在 Google AppEngine 数据存储开发人员的管理控制台中,您应该去掉引号并使用如下内容:
SELECT * FROM MyEntity WHERE __key__ = Key(MyEntity, 5695872079757312)
【讨论】:
就我而言,我必须将 ID 的类型从 String 更改为 Long
【讨论】: