簡體   English   中英

SQLAlchemy強制Left Join

[英]SQLAlchemy force Left Join

我有一點問題。 我有兩個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的技巧?

只需在適當的地方使用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性能是另一個問題,在ForeignKey列上有indices可能會有很大的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM