SQLAlchemy连接问题(连续连接)

2024-04-26 01:18:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道如何在标题中解释,但这是我面临的问题。你知道吗

我需要写下,我认为是一个相对直截了当的查询(不管怎样,在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炼金术查询是我的工作

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

正如你所看到的,第一部分是做得很顺利,直到它击中任务\你接触。。。然后一切都从那里向南发展。你知道吗

如何实现我的查询?任何指向正确方向的指示都将不胜感激。你知道吗


Tags: andclientidtasksqloncontactcode
1条回答
网友
1楼 · 发布于 2024-04-26 01:18:27

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

相关问题 更多 >