【问题标题】:Returning a count of grouped items in peewee ORM返回peewee ORM中分组项目的计数
【发布时间】:2017-08-18 15:49:57
【问题描述】:

我正在尝试查询一个唯一字段的列表,以及使用 peewee ORM 的每个唯一字段的计数。我可以从 MySQL 工作台轻松获得我想要的东西,但是我似乎无法从 peewee 中获得类似的结果。工作的 MySQL 查询如下所示:

select Title, Severity, count(*) from qmodel group by Title;

我尝试了一些 peewee 的变体,但没有任何效果。这与我得到的差不多:

from application.database.models import qmodel as q 

_field_select_list = [
    q.Title,
    q.Severity,
    fn.COUNT(q.Title),
]

for record in q.select(*_field_select_list).group_by(q.Title):
   print record

这将返回计数,但将返回的标题字段替换为计数,没有标题(例如{'Severity': '3', 'Title': '25'}

我还让我的字段选择看起来像这样:

_field_select_list = [
    q.Title,
    q.Severity,
    fn.COUNT(SQL('*')),
]

但这只是给了我一个分组列表,没有计数。我尝试了许多其他组合,但都没有运气。

【问题讨论】:

    标签: python mysql orm peewee


    【解决方案1】:

    你需要这样做:

    query = (QModel
             .select(QModel.title, QModel.severity, fn.COUNT(QModel.id).alias('ct'))
             .group_by(QModel.title, QModel.severity))
    for obj in query:
        print obj.title, obj.severity, obj.ct
    

    请注意,在大多数数据库中,您需要按您选择的每个非聚合列进行分组。

    【讨论】:

      【解决方案2】:

      您是否尝试过将COUNT 函数留空?它适用于我的数据。

      query = q.select(q.Title, q.Severity, fn.COUNT()).group_by(q.Title)
      

      【讨论】:

      • 这给了我一个语法错误。我很早就尝试过,因为从我所看到的情况来看,它似乎肯定会起作用。现在我更困惑它会为你工作。您使用的是哪个版本的 MySQL?
      • 我正在用 sqlite 快速测试。刚刚用 MySQL 5.5 试了一下,也收到了语法错误。所以至少它是一致的。我正在尝试不同的驱动程序和 MySQL 设置。
      • 奇怪的是,q.select(q.Title, q.Severity, fn.COUNT(SQL('*'))).group_by(q.Title) 非常适合使用 MariaDB 10.10 的我。你试过吗?检查日志,这会产生与您上面提到的工作等效的查询。
      • 使用SQL('*')没有错误,但也不是预期的结果。我也试过双引号。我得到了我的标题和字段值,但没有计数。
      • 奇怪,尝试使用.tuples() 来查看计数。
      猜你喜欢
      • 2011-05-02
      • 1970-01-01
      • 2013-11-08
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多