2017-07-29 20 views
0

對於標題混淆不清,很難弄清楚如何說出問題。當並非所有給定的參數都填滿時,爲用戶查詢數據庫

目前我有一個sqllite db,其中有一些用戶,他們有名字,姓氏,dob,高中和高中班。數據庫使用sqlalchemy連接到燒瓶。我想知道的是我的搜索功能,我有4個輸入,我想要它,所以如果沒有使用輸入,那麼它不會用於搜索查詢。假設這個人搜索我希望它使用這些參數進行搜索的姓和高中。我嘗試過使用一堆if語句來做這件事,但它看起來很亂,必須有更好的方法。以下是我使用的查詢,但僅適用於全部4個填充完成的情況。有一個更好的方法比一堆if語句有不同的查詢嗎?我環顧四周,沒有發現任何東西。

userq=User.query.filter_by(first_name=fname_strip,last_name=lname_strip,hs_class=hs_class_strip).all() 
+0

只是省略對應於你不想通過調用時要搜索的元素''kwargs' filter_by' – Suever

+0

反正有它不使用被設置爲none或「」 kwargs? –

+0

不要將'kwargs'與不需要的參數設置爲''''或'None' - 而是刪除空值。 – krassowski

回答

1

好吧,我所做的是通過並做出如你所說的陳述,但使他們成爲不同的變數。然後檢查他們是否沒有或不正確,如果他們是好的,那麼他們正確查詢,如果沒有,那麼查詢所有不爲空的東西。然後將它們改爲一組,然後設置交集,以查看它們之間的相同情況。感謝ionheart幫助我完成這一切,並提供這些信息,這是使用他的部分解決方案的完整答案。

  userf=set() 
      userl=set() 
      userc=set() 
      userh=set() 
      if fname_strip!='': 
       userf = User.query.filter_by(first_name=fname_strip).all() 
       print(userf) 
      else: 
       userf = User.query.filter(User.first_name.isnot(None)) 
      if lname_strip!='': 
       userl = User.query.filter_by(last_name=lname_strip).all() 
       print(userl) 
      else: 
       userl = User.query.filter(User.last_name.isnot(None)) 
      try: 
       int(hs_class_strip) 
       userc = User.query.filter_by(hs_class=hs_class_strip).all() 
       print(userc) 
      except: 
       userc = User.query.filter(User.hs_class.isnot(None)) 
      if hs_strip!='': 
       userh = User.query.filter_by(hs=hs_strip).all() 
       print(userh) 
      else: 
       userh = User.query.filter(User.hs.isnot(None)) 

      userq=[] 
      common=set(userf) & set(userl) & set(userc) & set(userh) 
      print(common) 
+0

很高興能爲您服務! – ionheart

0

如果傳遞的參數搜索功能作爲關鍵字參數,你可以更改簽名接受kwargs並通過那些在過濾器上查詢

def search(**kwargs): 
    userq = User.query.filter_by(**kwargs).all() 

這樣任何參數你不指定調用search時不會傳遞到查詢上,例如調用search(first_name='bob', last_name='fossil')將只爲查詢添加名字和姓氏參數

1

您可以嘗試if/else語句,如下所示:

q = User.query.filter_by(first_name=first_name) 
if lname_strip: 
    q = q.filter_by(last_name=lname_strip) 
if hs_class_strip: 
    q= q.filter_by(hs_class=hs_class_strip) 

# Execute the query 
q.all() 
  • 更新後的需要將q作爲一個賦值。
+0

我這樣做,它似乎沒有過濾後的第一個名字,如果我有2名具有相同的名字,但不同年份不會過濾它們之間的人。 –

+0

您需要通過將年份添加到過濾器來進一步優化搜索。我假設你的模型中有一年的專欄。 – ionheart

+0

年份是hs_class_strip就像他們有不同的姓氏,我試圖過濾它仍然會返回多個條目 –

相關問題