0

不太知道如何在标题中解释它,但这就是我所面临的。

我需要写,我认为是一个相对直接的查询(无论如何在 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)

我的想法是(并试图理解手册)。那是因为“任务”是 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

如你看到的; 第一部分正在游泳,直到它到达 task_contact... 然后一切都从那里向南走。

我将如何实现我的查询?任何正确方向的指针将不胜感激。

4

1 回答 1

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)
于 2013-08-18T09:48:06.843 回答