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)

我在这里的想法是(以及试图理解手册)。因为"Tasks"是query()中的第一个模型,所以它应该是重置点否?所以我想,首先连接资源端,重置连接,然后连接客户端。。。错误的

它生成这个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

正如你所看到的;第一部分做得很顺利,直到达到任务策略。。。然后一切都从那里向南发展。

我将如何实现我的查询?任何指向正确方向的指针都将受到赞赏。

我从文档中得到的印象是,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)

最新更新