【问题标题】:App Engine GQL Query - SortingApp Engine GQL 查询 - 排序
【发布时间】:2012-07-23 04:09:21
【问题描述】:

在 GAE (python) 中合并两个 GQLQueries 时遇到一些问题。

  fp_events = db.GqlQuery("SELECT * FROM Event WHERE firstPlayer=:1", alias).fetch(mylimit)
  sp_events = db.GqlQuery("SELECT * FROM Event WHERE secondPlayer=:1", alias).fetch(mylimit)
  events = fp_events.append(sp_events)

但是,当我尝试使用 for 循环 for event in events: 遍历这些事件时,我在该行收到 TypeError: 'NoneType' object is not iterable 错误。我怀疑这与我尝试执行的附加操作有关,尽管我不完全确定。

这些事件也有一个 datetime 属性...如何按时间降序对结果事件列表进行排序?虽然我可以在上面的两个查询中使用ORDER BY time DESC,但不一定保证它们的合并会被排序。

我还应该提到,Event 表的 firstPlayer 和 secondPlayer 属性是互斥的(没有事件将 firstPlayer 和 secondPlayer 设置为同一个玩家)。

谢谢!

【问题讨论】:

  • 您总是想要这些查询的整个结果集,还是只想要它们组合的前 n 个结果?如果是后者,那么通过合并操作可以更有效地完成此操作,而不是获取所有结果并对其进行排序。
  • 仅供参考:调用append 的结果是None

标签: python google-app-engine gql


【解决方案1】:

您可以使用list 将可迭代对象转换为 Python 列表:

fp_events = db.GqlQuery("SELECT * FROM Event WHERE firstPlayer = :1", alias).fetch(mylimit)
sp_events = db.GqlQuery("SELECT * FROM Event WHERE secondPlayer = :1", alias).fetch(mylimit)

要合并这两个列表,试试这个:

fp_events_list = list(fp_events)
sp_events_list = list(sp_events)
events = fp_events_list + sp_events_list

我刚刚在远程 shell 中针对我自己的一个 AppEngine 数据存储区进行了尝试,它确实有效。

恐怕为了得到你想要的排序,你必须用the sorted builtin对它们进行排序:

sorted_events = sorted(events, key=lambda event: event.time)

【讨论】:

  • 很遗憾,GQL 目前不支持 OR 子句。
  • 不幸的是,这仍然对我不起作用:/ 不支持 OR 的事实肯定会让这种事情头疼。
  • 您是否仍然遇到与您的问题相同的错误?您能否添加一些日志记录以确认 fp_events 和 sp_events 都是 not None
  • 是的......我实际上不认为 a.append(b) 或 a.extend(b) 是这样的查询的有效语法,但我不知道用什么来代替将两者结合起来。
  • 太棒了,效果很好,谢谢!我只需要以相反的顺序使用sorted_events,但这应该很容易做到。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2010-12-03
  • 2013-10-13
  • 2011-11-10
  • 2015-12-22
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2010-09-08
相关资源
最近更新 更多