返回peewee ORM中分组项目的计数

Posted

技术标签:

【中文标题】返回peewee ORM中分组项目的计数【英文标题】:Returning a count of grouped items in 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('*')),
]

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

【问题讨论】:

【参考方案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() 来查看计数。

以上是关于返回peewee ORM中分组项目的计数的主要内容,如果未能解决你的问题,请参考以下文章

Python ORM框架之 Peewee入门

peewee的使用 python orm

peewee连接池使用指南

按项目名称对交易进行分组

Peewee ORM中如何选择和限制related_name连接?

对数组中的项目进行分组和计数的简洁方法