che voglio "DBSession.query (articolo) .group_by (Article.created.month) .Tutte()"gruppo per anno, mese, giorno in una sqlalchemy
Ma questa query non può utilizzare
Come faccio a utilizzare SQLAlchemy?
che voglio "DBSession.query (articolo) .group_by (Article.created.month) .Tutte()"gruppo per anno, mese, giorno in una sqlalchemy
Ma questa query non può utilizzare
Come faccio a utilizzare SQLAlchemy?
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
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.
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 .
wow, grazie !!! ^^ – gamp
Grazie amico, così utile – pylover