2009-09-03 22 views

risposta

25

supponendo db Engine supporta in realtà funziona come MONTH(), si può provare

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

altro si può gruppo in Python come

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, grazie !!! ^^ – gamp

+0

Grazie amico, così utile – pylover

9

THC4k risposta funziona ma voglio solo aggiungere che query_result deve essere già ordinato per ottenere itertools.groupby come vuoi.

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

Ecco la spiegazione nella itertools.groupby docs:

Il funzionamento groupby() è simile al filtro uniq in Unix. Genera un'interruzione o un nuovo gruppo ogni volta che cambia il valore della funzione del tasto (che è il motivo per cui di solito è necessario aver ordinato i dati utilizzando la stessa funzione chiave). Questo comportamento differisce da GROUP BY di SQL che aggrega elementi comuni indipendentemente dal loro ordine di input.

2

So che questa domanda è antica, ma a beneficio di tutti coloro alla ricerca di soluzioni, ecco un'altra strategia per i database che non supportano funzioni come MESE():

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

Essenzialmente questo si sta trasformando i timestamp in stringhe troncate che possono essere raggruppate.

Se si desidera solo le voci più recenti, è possibile aggiungere, ad esempio:

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

Seguendo questa strategia, è possibile creare facilmente gruppi, come il giorno della settimana semplicemente omettendo l'anno e il mese .

Problemi correlati