返回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中分组项目的计数的主要内容,如果未能解决你的问题,请参考以下文章