在SQLAlchemy查询中进行分组/排序

2 投票
1 回答
2235 浏览
提问于 2025-04-17 18:47

这个“分组”和“排序”操作不太好使,主要是想要按分钟来统计HTTP.statusline的数量,然后把结果返回。现在返回的结果却是每分钟多次出现。在数据库里,日期是以字符串的形式保存的。

输出的例子:

{u'date': u'2013-03-12 11:23:48', u'count': 21}

但是有些东西返回了多个值,像这样:

{u'date': u'2013-03-12 11:36:21', u'count': 2}, {u'date': u'2013-03-12 11:36:21', u'count': 8}]

代码:

def statusline_date(status):
    session = load_session()
    now = datetime.datetime.now()
    DD = now - datetime.timedelta(minutes=60)
    DD = DD.strftime('%Y-%m-%d %H:%M:%S')
    #query = session.query(HTTP.date, extract('minute', HTTP.date).label('min'), HTTP.statusline, func.count(HTTP.statusline).
    #        label('count')).filter(HTTP.statusline.like('%'+status+'%'), HTTP.date>=(DD+'%')).group_by('min').all()
    query = session.query(HTTP.date, HTTP.statusline, func.count(HTTP.statusline).
            label('count')).filter(HTTP.statusline.like('%'+status+'%'), HTTP.date>=(DD)).group_by(HTTP.date, HTTP.statusline).order_by(asc(HTTP.date)).all()

    result = [{'date': t.date, 'count': t.count} for t in query]

    return result

1 个回答

4

你在按日期和状态进行分组;很可能这两个结果的状态行是不同的。

你可以选择把状态行包含在输出中,或者干脆把它从分组和输出的列中去掉。

如果包含状态行的话:

result = [{'date': t.date, 'count': t.count, 'status': t.statusline} for t in query]

这样可以显示出有什么不同。

如果把状态列从分组和输出的列中去掉的话:

query = session.query(HTTP.date, func.count(HTTP.statusline).
        label('count')).filter(HTTP.statusline.like('%'+status+'%'), HTTP.date>=(DD)).group_by(HTTP.date).order_by(asc(HTTP.date)).all()

你可以用 .contains(status) 来代替 .like('%'+status+'%');通常来说,这个方法的实现方式和 LIKE 是一样的,但你就不用自己去拼接 % 了。

撰写回答