SQLAlchemy强制Left Join

SIk*_*wan 6 python sqlalchemy

我有一点问题.我有两个SQL表(ip和客户端)绑定第三个(ip_client).我没有使用SQLAlchemy附带的多对多关系,因为我的一些查询发生了复杂的过滤.

一切都很好,除了一个愚蠢的用例.我想列出没有客户端的所有IP,没有外连接我不能这样做.

外连接需要几秒钟,其中使用左连接的相同查询是即时的.但是无法避免SQL Alchemy创建的INNER JOIN.我尝试了所有的关系,并移动我的外键,但它保持INNER JOIN.

基于同样的问题,每当我尝试使用显示客户端数量的列列出所有ips时,查询将不会返回具有0个客户端的ips(INNER JOIN的自然行为).

有没有办法强迫它?

顺便说一下这是我的查询:

query = (session.query(Ip, func.count(Client.id))
    .join(ClientIp, ClientIp.ip_id==Ip.id)
    .join(Client, Client.id==ClientIp.client_id)
    .group_by(Ip.id))
Run Code Online (Sandbox Code Playgroud)

在查询创建或连接函数中是否存在强制LEFT JOIN的技巧?

van*_*van 22

只需使用outerjoin而不是join在适当的地方:

query = (session.query(Ip, func.count(Client.id)).
    outerjoin(ClientIp, ClientIp.ip_id==Ip.id).
    outerjoin(Client, Client.id==ClientIp.client_id).
    group_by(Ip.id)
)
Run Code Online (Sandbox Code Playgroud)

性能OUTER JOIN是另一个问题,indicesForeignKey列上可能会有很大的帮助.