我有点问题。我有两个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的技巧?
答案 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
可能会有很大的帮助。