2009-09-03 5 views

Antwort

25

Sie DB-Engine unter der Annahme tatsächlich unterstützt Funktionen wie MONTH(), Sie

import sqlalchemy as sa 
DBSession.query(Article).group_by(sa.func.year(Article.created), sa.func.month(Article.created)).all() 

Sie sonst in Python können Gruppe wie

from itertools import groupby 

def grouper(item): 
    return item.created.year, item.created.month 
for ((year, month), items) in groupby(query_result, grouper): 
    for item in items: 
     # do stuff 
+0

wow, danke !!! ^^ – gamp

+0

Vielen Dank, Mann, so nützlich – pylover

9

THC4k Antwort arbeitet aber ich möchte nur hinzufügen, können versuchen, dass query_result müssen bereits sein, sortiert, um itertools.groupby zu bekommen, wie Sie wollen. Hier

query_result = DBSession.query(Article).order_by(Article.created).all() 

ist die Erklärung in der itertools.groupby docs:

Der Betrieb groupby() ist ähnlich dem uniq Filter in Unix. Bei jedem Wechsel des Wertes der Schlüsselfunktion wird eine Pause oder eine neue Gruppe generiert (daher ist es in der Regel notwendig, die Daten mit derselben Schlüsselfunktion zu sortieren). Dieses Verhalten unterscheidet sich von SQL GROUP BY, das allgemeine Elemente aggregiert, unabhängig von ihrer Eingabereihenfolge.

2

Ich weiß, diese Frage ist alt, aber zum Nutzen von jedermann nach Lösungen suchen, hier ist eine andere Strategie für Datenbanken, die nicht unterstützen Funktionen wie MONAT():

db.session.query(sa.func.count(Article.id)).\ 
    group_by(sa.func.strftime("%Y-%m-%d", Article.created)).all() 

Im Wesentlichen ist diese Dreh die Zeitstempel in abgeschnittene Zeichenfolgen, die dann gruppiert werden können.

Wenn Sie nur die neuesten Einträge möchten, können Sie zum Beispiel hinzufügen:

order_by(Article.created.desc()).limit(7) 

Nach dieser Strategie können Sie bequem Gruppierungen wie Tag-of-Woche schaffen kann einfach durch das Jahr und Monat Weglassen .