2017-02-05 59 views
0

我正在爲公司及其子公司的數據庫實施一些搜索功能。對於每個公司可能有多個子公司或沒有。每個子公司都有一個company_id列,將其鏈接到母公司表的id列。SQLAlchemy查詢可能不存在一行

這裏是一個名稱如何爲公司尋找一個例子:

def search_by_company_name(name): 
    company_search = session.query(Company.name).filter(Company.name.like('%{}%'.format(name))) 
    return company_search.all() 

我要的是能夠通過搜索,不僅它的名字來查詢的公司,但任何附屬公司還名稱是可能會分享類似的名字。我現在所擁有的是:

def search_by_company_and_subsidiary_name(name): 
    company_search = session.query(Company.name).filter(Company.name.like('%{}%'.format(name)) | Subsidiary.name.like('%{}%'.format(name))) 
    search_results = company_search.filter(Company.id == Subsidiary.company_id) 
    return search_results.all() 

與我的方法的問題是,如果有一定的母公司沒有子公司,則該查詢返回任何內容,即使名稱搜索的公司行匹配表。

例如:

search_by_company_name('accenture') 
>>> [('Accenture',)] 

然而

search_by_company_and_subsidiary_name('accenture') 
>>> [] 

我敢肯定的是,第二個函數返回[]因爲有埃森哲子公司沒有在我的數據庫,所以謂語.filter(Subsidiary.company_id == Company.id)是基本上消除了公司表中已經找到的任何結果。我在想這個解決方案可能是做一個左連接的事情,但是我經過一段時間的排解後還沒有運氣。

是否有一種很好的方法在SQLAlchemy中執行這樣的查詢,當某個給定的公司的輔助表中沒有匹配的行時,仍然會返回在某個表中找到的所有行?

回答

2

您可能會考慮實施外連接而不是嚴格的過濾條件,例如,沿線的東西:

def search_by_company_and_subsidiary_name(name): 
    return session.query(Company) 
        .outerjoin(Subsidiary, Company.id == Subsidiary.company_id) 
        .filter(Company.name.like('%{}%'.format(name)) | Subsidiary.name.like('%{}%'.format(name))) 
        .all() 
+0

經過多一點挖掘,這其實是我最終做的,謝謝你的答案! –

+0

很好讀Zach。希望你能接受答案。 :) – TheArchitect