2012-09-28 44 views
0

首先,如果事實證明我想要做的是在這裏抽菸,我絕不是數據庫或SQLA專家。 =)SQLAlchemy,用表繼承過濾連接的查詢

我有兩個類,人員和組織,使用表繼承從聯繫繼承。 (Person.id是Contact.id的fkey),它工作正常。

我想從搜索框中搜索並獲取所有聯繫人列表。通常,當我在一組事物後,我這樣做:

def build_query(self): 
  return self.session.query(Person) 

def filter_query(self, query) 
    if self.search_form_values.get('name_last',None): 
        query = query.filter(
      Person.name_last==self.search_form_values.get('name_last') 
     ) 
    ... 
    return query 

然後在其他地方查詢得到執行。問題是我想找回聯繫人對象列表 ,但我想過濾Organization.name,Person.name_last和Person.name_first,所有這些值都是從鍵入 的值到搜索的「名稱」框中形成。我無法弄清楚如何用一個查詢來做到這一點,不知道是否有可能。 雖然我確實希望避免讓兩個單獨的查詢產生交錯結果。

有沒有一些過濾功夫,讓我做到以上?即

  • 找回所有的聯繫人:
    • 已經name_last或name_first匹配,如果聯繫人是一個人
    • 有名稱匹配,如果接觸是一個組織

謝謝

Iain

回答

0

我認爲這在SQL中根本不容易實現。一個SQL查詢只能返回固定數量的列,並且每一行都必須包含所有相同的列。你的人和組織顯然不同。

當然可以返回兩個表的列的聯合,將特定記錄中不存在的列設置爲null。我不認爲SQLAlchmey對象很容易從這些數據重新創建。我並不是說這是不可能的,但我敢打賭,10美元是不切實際的。

如果我是你,我寧願使用兩個查詢,合併結果,並查看性能是否足夠糟糕以至於不在乎。

當然,獲取和合並兩個查詢會導致分頁輸出很痛苦。如果我關心搜索響應能力,我可能會考慮獲取過多記錄並將其緩存到RAM或臨時表中,並鏈接到特定的搜索請求(例如其散列)。很少有需要2-3頁以上的用戶需要等待大量的查詢才能運行,但大多數用戶將得到快速的服務。