2

这个 group by / order by 是行不通的,关键是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
4

1 回答 1

3

您正在对日期和状态行进行分组;很可能两个结果之间的状态行不同。

要么在输出中包含该状态行,要么将其从组和输出列中完全删除。

包括状态行:

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()

代替.like('%'+status+'%'),您也可以使用.contains(status); 它通常作为 LIKE实现,但您不必%自己进行连接。

于 2013-03-12T11:01:32.820 回答