我有一点问题.我有两个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是另一个问题,indices在ForeignKey列上可能会有很大的帮助.
| 归档时间: |
|
| 查看次数: |
23131 次 |
| 最近记录: |