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

SQLAlchemy查询项目成员时去重并关联对应团队的问题

解决SQLAlchemy查询中members列表关联错误及重复问题

当前查询项目时,teams字段能正确获取,但members列表返回数据库所有成员且存在重复,需要让members仅包含该项目对应团队的成员,并去除重复数据。

问题原因

  1. members的子查询未添加与当前项目的关联条件,导致拉取了TeamMemberLinkModel中的全部数据
  2. 聚合函数array_agg未做去重处理,导致同一成员因多关联关系重复出现

解决方案

修改members字段的子查询,添加项目与团队的关联逻辑,并通过DISTINCT去除重复数据:

teamIds = db.session.query(TeamMemberLinkModel.teamId).filter(TeamMemberLinkModel.memberId == memberId)

projectQuery = db.session.query(
    ProjectModel.name,
    ProjectModel.isActive,
    select(func.array_agg(
        func.json_build_object(
            'teamId', ProjectTeamLinkModel.teamId,
            'teamName', ProjectTeamLinkModel.teamName,
            'colorCode', ProjectTeamLinkModel.colorCode
        )
    )).where(
        ProjectTeamLinkModel.teamId.in_(teamIds),
        ProjectTeamLinkModel.projectId == ProjectModel.id
    ).label('teams'),
    ProjectModel.id,
    ProjectModel.clientId,
    # 修改后的members子查询
    select(func.array_agg(
        func.distinct(func.json_build_object(
            'memberName', TeamMemberLinkModel.memberName,
            'memberId', TeamMemberLinkModel.memberId,
            'roleId', TeamMemberLinkModel.roleId,
            'roleName', TeamMemberLinkModel.roleName
        ))
    )).where(
        # 关联当前项目对应的所有团队ID
        TeamMemberLinkModel.teamId.in_(
            select(ProjectTeamLinkModel.teamId).where(ProjectTeamLinkModel.projectId == ProjectModel.id)
        )
    ).label('members'),
    ProjectModel.isDeleted,
    func.json_build_object(
        'id', ProjectModel.clientId,
        'name', ProjectModel.clientName
    ).label('client')
).filter(
    ProjectModel.id.in_(unionQuery),
    ProjectModel.isDeleted.is_(False)
)

关键修改说明

  • 关联项目团队:通过嵌套子查询获取当前项目绑定的所有团队ID,限定TeamMemberLinkModel仅查询这些团队下的成员,确保数据关联性正确
  • 去除重复数据:在array_agg内部使用func.distinct(),对生成的成员JSON对象进行去重,避免同一成员因多角色/多团队关联导致的重复

内容的提问来源于stack exchange,提问作者HyperOni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:30:40