我想 「DBSession.query(條).group_by(Article.created.month)。所有()」組按年,月,日的SQLAlchemy的
但這種查詢可以不使用
如何使用SQLAlchemy執行此操作?
我想 「DBSession.query(條).group_by(Article.created.month)。所有()」組按年,月,日的SQLAlchemy的
但這種查詢可以不使用
如何使用SQLAlchemy執行此操作?
假設你數據庫引擎實際上支持功能,如MONTH()
,你可以嘗試
import sqlalchemy as sa
DBSession.query(Article).group_by(sa.func.year(Article.created), sa.func.month(Article.created)).all()
否則你可以在python組像
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答案工程但我只想補充一點, query_result
需要已經排序得到itertools.groupby
工作你想要的方式。
query_result = DBSession.query(Article).order_by(Article.created).all()
這裏是在itertools.groupby docs的解釋:)
GROUPBY的操作(類似於Unix上uniq的過濾器。每當關鍵函數的值發生變化時它就會生成一箇中斷或新的組(這就是爲什麼通常需要使用相同的關鍵函數對數據進行排序的原因)。該行爲與SQL的GROUP BY不同,後者聚合公共元素而不管其輸入順序如何。
我知道這個問題是古老的,但任何人尋找解決方案的好處,這裏是()另一種策略數據庫不支持如月功能:
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)
遵循這一發展戰略,您可以輕鬆地創建分組,如一天的一週只需通過省略年份和月份。
哇,謝謝!!! ^^ – gamp 2009-09-03 01:36:53
謝謝大家,好有用 – pylover 2012-07-04 16:49:23