2

このグループ化/順序付けは機能しません。ポイントは、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

日付とステータス行の両方でグループ化しています。ほとんどの場合、ステータスラインは2つの結果間で異なります。

そのステータス行を出力に含めるか、グループ列と出力列から完全に削除します。

ステータス行を含める:

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 に答える