You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:33:17