在SQLAlchemy查询中进行分组/排序
这个“分组”和“排序”操作不太好使,主要是想要按分钟来统计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 是一样的,但你就不用自己去拼接 %
了。