背景: 有个一个组织机构. 并没有设计父级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
标签:aa,sqlalchemy,递归,title,nature,查询,query,Organization,id
From: https://www.cnblogs.com/gatling/p/18302570