SQLAlchemy强制Left Join

时间:2013-11-12 16:10:49

标签: 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))

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

1 个答案:

答案 0 :(得分:21)

在适当情况下使用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)
)

OUTER JOIN的效果是另一个问题,indices列上的ForeignKey可能会有很大的帮助。