2015-10-14 43 views
2

我在這裏遇到了一個非常特殊的問題: 我需要在SQLAlchemy中進行LIKE搜索,但關鍵字數量不盡相同。 繼承人的一個關鍵字代碼:使用不同的關鍵字進行SQLAlchemy搜索

search_query = request.form["searchinput"] 
if selectet_wg and not lagernd: 
    query = db_session.query(
     Artikel.Artnr, 
     Artikel.Benennung, 
     Artikel.Bestand, 
     Artikel.Vkpreisbr1 
    ).filter(
     and_(
      Artikel.Benennung.like("%"+search_query+"%"), 
      Artikel.Wg == selectet_wg 
     ) 
    ).order_by(Artikel.Vkpreisbr1.asc()) 

「searchinput」 看起來是這樣的: 「property1,property2,property3」,但也可以僅僅是1,2,5或更多propertys。 我想分割searchinput在「,」(是的,我知道該怎麼做:)),並插入另一個LIKE搜索每個屬性。 因此,對於上面的例子中的搜索應該尋找這樣的:

search_query = request.form["searchinput"] 
if selectet_wg and not lagernd: 
    query = db_session.query(
     Artikel.Artnr, 
     Artikel.Benennung, 
     Artikel.Bestand, 
     Artikel.Vkpreisbr1 
    ).filter(
     and_(
      Artikel.Benennung.like("%"+search_query+"%"), #property1 
      Artikel.Benennung.like("%"+search_query+"%"), #property2 
      Artikel.Benennung.like("%"+search_query+"%"), #property3 
      Artikel.Wg == selectet_wg 
     ) 
    ).order_by(Artikel.Vkpreisbr1.asc()) 

我不認爲它是一個聰明的想法只是爲了讓一個如果propertys量發言,並記下查詢serveral的時間... 即時通訊使用的SQLAlchemy的3.4

回答

3

應該可以的,你喜歡的過濾器來創建一個列表,並將它們全部傳遞到and_
首先創建類似查詢的列表:

search_queries = search_query.split(',') 
filter = [Artikel.Benennung.like("%"+sq"%") for sq in search_queries] 

然後將它們傳遞到and_,拆包名單:

and_(
    Artikel.Wg == selectet_wg, 
    *filter 
    ) 

*filter必須是最後一個參數and_否則蟒蛇會給你一個錯誤。

+0

這工作就像一個魅力!謝謝 – knusperwurst

2

可以調用過濾多次,最新版本和Python:

search_query = request.form["searchinput"] 
if selectet_wg and not lagernd: 
    query = db_session.query(
     Artikel.Artnr, 
     Artikel.Benennung, 
     Artikel.Bestand, 
     Artikel.Vkpreisbr1 
    ).filter(Artikel.Wg == selectet_wg) 

    for prop in search_query.split(','): 
     query = query.filter(Artikel.Benennung.like("%"+prop+"%")) 

    query = query.order_by(Artikel.Vkpreisbr1.asc())