在sqlalchemy查询中分组/排序

时间:2013-03-12 10:37:22

标签: python json python-2.7 sqlalchemy

这个小组由/命令不工作,重点是在分钟上计算HTTP.statusline然后返回它。现在它返回多个时间分钟。在数据库中,日期保存为String。

输出示例:

{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 个答案:

答案 0 :(得分: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()

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