sqlalchemy 递归查询

背景: 有个一个组织机构. 并没有设计父级id, 只有id, title, nature 三个字段, nature=1/2/3/4 分别表示级几级单位;
现在要模糊查询本级, 上级, 上上级, 上上上级的title中包含 特定字符的记录;使用sqlalchemy递归查询,下面代码没调试,不保证运行, 主要看思路;

def find_orgs_with_aa(session: Session):
    # 使用递归CTE查询,首先定义CTE的基本查询和递归部分
    cte_query = (
        session.query(
            Organization.id,
            Organization.title,
            Organization.nature,
            func.cast(None, Integer).label('parent_id')  # 初始化没有父级ID
        )
        .filter(Organization.title.contains('aa'), Organization.nature == 1)  # 找到所有一级机构包含aa的
    
        .union_all(
            # 递归部分,查找所有上级机构(nature较小的)
            session.query(
                Organization.id,
                Organization.title,
                Organization.nature,
                Organization.id.label('parent_id')  # 使用当前机构的ID作为父级ID
            )
            .join(Organization, Organization.id == Organization.parent_id)  # 自连接,找到上级
            .filter(Organization.title.contains('aa'))  # 上级机构标题也需包含aa
        )
    ).cte(name='recursive_cte', recursive=True)

    # 最终查询,从CTE中选择所有需要的记录
    final_query = session.query(Organization).select_from(cte_query).subquery()
    result = session.query(final_query).all()

    return result
posted @ 2024-07-15 10:05  干炸小黄鱼  阅读(3)  评论(0编辑  收藏  举报