代码之家  ›  专栏  ›  技术社区  ›  Thilo

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

  •  72
  • Thilo  · 技术社区  · 15 年前

    如何在Google应用程序引擎数据查看器中使用gql针对实体键编写查询?

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

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

    此查询不起作用:

    SELECT * FROM Programme where name = '_1'
    
    5 回复  |  直到 7 年前
        1
  •  105
  •   tristansokol    7 年前

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

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

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

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

    请注意,这不是您希望在AppEngine应用程序中做的事情;正如Nick在他的评论中指出的那样,这是一种巨大的浪费时间。实际上,这个示例只适合演示如何在管理控制台中按键进行查询。

        2
  •  20
  •   Jeffrey Miller    14 年前

    对于数字ID,类似于按名称查询的表单有效:

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

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

        3
  •  18
  •   alex    9 年前

    您根本不需要通过查询来获取一个按键的实体-您只需通过它的键来获取实体。在python中,您可以使用 MyModel.get_by_key_name('_1') . 这比亚当建议使用查询的速度快3到5倍。

        4
  •  2
  •   aij    11 年前

    按键查询时,需要精确匹配键,包括父项,而不仅仅是ID或名称。当然,如果父级为空,如上面的示例所示,那么ID或名称以及实体的类型就足够了。

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

    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
  •  1
  •   Nathan Tuggy TonyLuigiC    10 年前

    这只是一个简短的说明:当我在键中的任何参数周围使用任何引号时,调用失败(在管理控制台中,我会得到错误弹出窗口)。

    例如,对于id/name为12345的“mytype”类型,这是 不是 工作:

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

    但是这样做:

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