【问题标题】:App Engine's filter vs. gql methodsApp Engine 的过滤器与 gql 方法
【发布时间】:2010-07-21 22:55:40
【问题描述】:

我的系统中有一个用户创建了一个我想检索的实体。我正在尝试使用filter 来执行此操作,因为它应该比调用gql method 更快。但是,过滤器不返回任何结果,并且 gql 有效。

randy_res = Vote.all().filter('created_by=', randy).fetch(limit=10)
randy_res = Vote.gql('WHERE created_by=:1', randy)

filter 会返回一个空列表,而 gql 调用会返回正确的结果吗?

【问题讨论】:

  • 顺便说一句,与实际执行查询的开销相比,使用 gql 和过滤器构建查询的速度差异应该是微不足道的。如果 gql 对您来说更具可读性或更直观,请坚持使用。
  • 尽管我不喜欢 GQL,但@Drew 是对的:任何性能差异都是微不足道的。

标签: google-app-engine filter gql gqlquery


【解决方案1】:

使用filter() 时,要求在字段名称和运算符之间留一个空格。要让您的 filter() 调用按预期工作,您只需在等号前插入一个空格:

randy_res = Vote.all().filter('created_by =', randy).fetch(limit=10)

【讨论】:

  • 啊啊啊啊!这让我疯了一个晚上。无声的失败是我最糟糕的噩梦。我在 2 年前提交了一个问题,但看起来其他人都不在乎(只有 6 颗星)。 code.google.com/p/googleappengine/issues/detail?id=688
  • @Peter 不幸的是,这不是错误:原始代码是对名称为“created_by=”的属性的完全有效查询,任何更改都会破坏这种(诚然相当不常见的)行为。跨度>
  • 叹息。我知道这不是严格意义上的错误。我确实喜欢在 api 中称其为“疣”,正如 ryanb 在问题日志中所说的那样。 :) 也许我应该考虑在 findbugs 或 eclipse 中创建一个规则,当它看到缺少空间时会给我一个警告。
  • 同意。在文档中突出显示此行为可能会有所帮助。文档总是在运算符之前使用一个空格,但我不记得有任何提示强调这个空格的重要性。
  • 这让我昨天也发疯了。但@nick 的解释是合理的
猜你喜欢
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2013-10-13
  • 2023-03-11
  • 2012-10-15
  • 1970-01-01
  • 2012-04-27
相关资源
最近更新 更多