2009-09-03 14 views

Respuesta

25

que asumir db motor realidad compatible con funciones como MONTH(), puede intentar

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

otra cosa puede agrupar en Python como

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

+0

Gracias hombre, tan útil – pylover

9

THC4k respuesta trabaja, pero sólo quiero añadir que query_result necesita estar ya ordenado para obtener itertools.groupby trabajando de la manera que desee.

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

Aquí es la explicación en el itertools.groupby docs:

El funcionamiento de GroupBy() es similar al filtro uniq en Unix. Genera un descanso o un nuevo grupo cada vez que cambia el valor de la función clave (por lo que generalmente es necesario haber ordenado los datos usando la misma función de tecla). Ese comportamiento difiere del GROUP BY de SQL que agrega elementos comunes independientemente de su orden de entrada.

2

Sé que esta pregunta es antigua, pero en beneficio de cualquier persona en busca de soluciones, aquí hay otra estrategia para bases de datos que no son compatibles con funciones como MES():

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

Esencialmente esto se está convirtiendo las marcas de tiempo en cadenas truncadas que luego se pueden agrupar.

Si sólo desea las entradas más recientes, se puede añadir, por ejemplo:

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

Siguiendo esta estrategia, se puede crear fácilmente agrupaciones tales como días de la semana, simplemente omitiendo el año y mes .

Cuestiones relacionadas