2014-09-17 3 views
0

У меня возникла проблема с построением кода SQLAlchemy, необходимого для создания следующего необработанного SQL-запроса.Рекурсивный запрос CTE

WITH RECURSIVE recruiters AS (
    SELECT 
     recruiter.id 
    FROM 
     recruiter 
    JOIN 
     recruiter_member ON recruiter.id = recruiter_member.recruiter_id 
    WHERE 
     recruiter_member.user_id = 'f12c617a-415c-4f8c-add0-81a597545be8' 
    UNION ALL 
    SELECT 
     children.id 
    FROM 
     recrutiers AS parents, 
     recruiter AS children 
    WHERE 
     children.recruiter_id = parents.id 
) 
SELECT 
    * 
FROM 
    recruiters 

Модели здесь Recruiter и RecruiterMember. Я просто не могу получить UNION вправо.

Возможно, вам поможет помощь или подсказки о том, как это сделать.

Спасибо,

Крис

ответ

2

Без получения более подробной информации, это было лучшее, что я мог придумать:

from sqlalchemy import orm 

parent = orm.aliased(Recruiter) 
child = orm.aliased(Recruiter) 
top_q = (
    orm.query.Query([Recruiter.id.label('id')]) 
    .join(RecruiterMember, Recruiter.id == RecruiterMember.recruiter_id) 
    .filter(RecruiterMember.user_id == 'f12c617a-415c-4f8c-add0-81a597545be8') 
    .cte(recursive=True)) 
bottom_q = (
    orm.query.Query([child.id.label('id')]) 
    .join(parent, parent.id == child.recruiter_id)) 

final_query = top_q.union_all(bottom_q) 

orm.query.Query([final_query.c.id]).with_session(session).all() 
+0

Большое спасибо, это была большая помощь :) – krak3n

Смежные вопросы