SQLAlchemy加入问题(连续加入)

时间:2013-08-17 17:41:33

标签: python join sqlalchemy

我不太清楚如何在标题中解释它,但这就是我所面对的。

我需要写,我认为这是一个相对简单的查询(无论如何都在SQL中):

SELECT 
    tasks.*, 
    resource_contact.*, 
    client_contact.* 
FROM 
    tasks, 
    TaskResReln,
    contact resource_contact,
    TaskContact
    contact client_contact,
WHERE
    tasks.task_id = TaskResReln.task_id
    AND TaskResReln.contact_code = resource_contact.contact_code
    AND tasks.task_id = TaskContact.task_id
    AND TaskContact.contact_code = client_contact.contact_code

我眼中的询问并不多;非常直接...但是,将其转换为SQL Alchemy查询正在执行我的

tasks = db.session.query(Tasks,client_contact,resource_contact)\
    .join(TaskResReln, resource_contact)\
    .reset_joinpoint()\
    .join(TaskContact, client_contact)

我的想法是(并试图弄清楚手册)。因为“任务”是查询()中的第一个模型,它应该是重置点否?所以我想,首先加入资源方面,重置连接,然后加入客户端......错了。

它生成这个SQL:

FROM 
    tasks JOIN task_res_reln ON tasks.task_id = task_res_reln.task_id 
    JOIN contact AS contact_2 ON contact_2.contact_code = task_res_reln.contact_code 
    JOIN task_contact ON contact_2.contact_code = task_contact.contact_code 
    JOIN contact AS contact_1 ON contact_1.contact_code = task_contact.contact_code

正如你所看到的;第一部分是游泳,直到它遇到task_contact ......然后它从那里向南走。

我如何才能实现查询?任何指向正确方向的人都会受到赞赏。

1 个答案:

答案 0 :(得分:3)

我从文档中得到一个印象,reset_joinpoint()旨在与join()的自动别名一起使用(当aliased=True标志传递给它时)。在您的情况下,您可以自己提供ON条款:

q = session.query(Tasks, client_contact, resource_contact).\
    join(TaskResReln).\
    join(resource_contact).\
    join(TaskContact, Tasks.task_id == TaskContact.task_id).\
    join(client_contact)