2009-09-03 4 views

ответ

25

Предполагая, что вы дб двигатель на самом деле поддерживает такие функции, как MONTH(), вы можете попробовать

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

еще можно сгруппировать в питона как

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

ничего себе, спасибо !!! ^^ – gamp

+0

Спасибо, человек, так полезен – pylover

9

THC4k ответ работает, но я просто хочу добавить, что query_result должно быть уже отсортировано, чтобы получить itertools.groupby, работая так, как вы хотите.

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

Вот объяснение в itertools.groupby docs:

Работа GroupBy() похож на фильтр UniQ в Unix. Он генерирует разрыв или новую группу каждый раз, когда изменяется значение ключевой функции (поэтому, как правило, необходимо сортировать данные с использованием одной и той же ключевой функции). Это поведение отличается от SQL GROUP BY, которое объединяет общие элементы независимо от их порядка ввода.

2

Я знаю, что этот вопрос является древним, но на благо всех, кто ищет решения, вот еще одна стратегия для баз данных, которые не поддерживают такие функции, как МЕСЯЦ():

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

По сути это превращается временные метки в усеченные строки, которые затем могут быть сгруппированы.

Если вы просто хотите, самые последние записи, вы можете добавить, например:

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

Следуя этой стратегии, вы можете легко создавать группировки, такие как день-неделю, просто опуская год и месяц ,

Смежные вопросы