我想要
DBSession.query(Article).group_by(Article.created.month).all()
但此查询无法使用
如何使用SQLAlchemy执行此操作?
答案 0 :(得分:30)
假设您的数据库引擎实际上支持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
答案 1 :(得分:9)
THC4k答案有效,但我只想补充一点query_result
需要已经排序才能让itertools.groupby
以您想要的方式运作。
query_result = DBSession.query(Article).order_by(Article.created).all()
以下是itertools.groupby docs中的解释:
groupby()的操作类似于Unix中的uniq过滤器。每次键函数的值发生变化时,它都会生成一个中断或新组(这就是为什么通常需要使用相同的键函数对数据进行排序)。这种行为不同于SQL的GROUP BY,它聚合了常见元素而不管它们的输入顺序如何。
答案 2 :(得分:3)
我知道这个问题很古老,但为了任何寻求解决方案的人的利益,这里是另一种不支持MONTH()函数的数据库策略:
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)
遵循此策略,您只需省略年份和月份,即可轻松创建分组,例如星期几。