【问题标题】:GQL query ReferenceProperty for objects with no references没有引用的对象的 GQL 查询 ReferenceProperty
【发布时间】:2013-10-20 13:05:41
【问题描述】:

我有以下型号,其中一个Thing可以有多个Action

class Thing(polymodel.PolyModel):
    create_date = db.DateTimeProperty(required=True)

class Action(db.Model):
    thing = db.ReferenceProperty(Thing, collection_name='action')    
    action_by = db.StringProperty(required=True)

我需要使用原始 GQL 来计算没有操作的 Things 的数量。它应该是这样的:

SELECT * FROM Thing WHERE action = []

我有以下限制:

  1. 我必须使用原始 GQL(因为实际查询包含常规查询不支持的 DISTINCT)。
  2. 我无法获取数据并检查内容,因为我使用远程 api,只想统计数据以节省带宽。

可以吗?

【问题讨论】:

  • 您打算处理什么样的数据量?即,您对 Thing 和 Event 实体的数量有何期望?您需要多久执行一次此查询,以及您需要多久得到答案?
  • 感谢您的回复。应该有数万个 Thing 和大约相同数量的 Action。查询应该每天运行大约几百次,主要关注点不应该是下载所有数据,而只是计算它。我知道我可以在 GAE 服务器上的 python 中实现这个,但我正在寻找一个更简单的解决方案,如果存在的话。

标签: python google-app-engine google-cloud-datastore gql


【解决方案1】:

首先,您说必须使用 GQL 是完全错误的,因为普通查询不支持 DISTINCT:没有任何事情您可以使用 GQL 来完成您无法使用正常查询。数据存储不是数据库,并且没有 ORM 调用必须翻译成的底层查询语言;相反,实际上 GQL 调用被翻译成 RPC 调用的方式与模型调用完全一样,使用 GQL 完全没有任何好处。在这种特定情况下,Query class 有一个distinct 参数。

但是,数据存储不是 SQL 数据库的另一个含义是您不能执行 JOIN。无法根据 Action 中的任何属性来选择 Thing 的实例,无论是特定字段值还是不存在任何关系。这样做的唯一方法是获取 Action.thing 的所有不同值,然后是所有 Things,并计算出集合差异。

【讨论】:

  • 此外,您不能查询没有设置值的内容,这与设置为 None 的内容不同。在上面的代码中,如果没有为引用属性提供键/对象,那么就没有可以查询的值。
猜你喜欢
  • 2011-08-17
  • 2010-11-16
  • 2010-10-25
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多