如何在Association Proxy中使用func.week、func.year进行分组查询
SQLAlchemy关联代理分组查询报错解决方案
问题根源
association_proxy只是个代理层,并非直接的数据库列表达式,仅支持比较类操作(如等于、大于),没法直接配合func.year()、func.week()这类分组函数使用。
解决思路
跳过AcUsers上的代理字段,直接在查询中关联AcTests模型,使用它的原始字段做分组统计。
示例代码
假设你的模型关系是AcUsers关联到AcTests,last_test_submit_time是AcTests的原生字段,AcUsers通过association_proxy代理了该字段。
按年统计用户数量
from sqlalchemy import func, select stmt = ( select( func.year(AcTests.last_test_submit_time).label("统计年份"), func.count(AcUsers.id).label("用户数量") ) .join(AcUsers, AcUsers.last_test == AcTests) # 替换为你的实际关联条件 .group_by(func.year(AcTests.last_test_submit_time)) ) result = session.execute(stmt).all()
按周统计用户数量
stmt = ( select( func.year(AcTests.last_test_submit_time).label("统计年份"), func.week(AcTests.last_test_submit_time).label("统计周数"), func.count(AcUsers.id).label("用户数量") ) .join(AcUsers, AcUsers.last_test == AcTests) .group_by(func.year(AcTests.last_test_submit_time), func.week(AcTests.last_test_submit_time)) ) result = session.execute(stmt).all()
按日统计用户数量
stmt = ( select( func.date(AcTests.last_test_submit_time).label("统计日期"), func.count(AcUsers.id).label("用户数量") ) .join(AcUsers, AcUsers.last_test == AcTests) .group_by(func.date(AcTests.last_test_submit_time)) ) result = session.execute(stmt).all()
注意事项
- 如果是一对多关联,为避免重复统计,可改用
func.count(func.distinct(AcUsers.id))计算用户数。 - 确保关联条件与你的模型实际关系匹配,比如如果用关联表,需要调整
join语句。
内容的提问来源于stack exchange,提问作者dave
相关产品推荐
相关产品推荐

