2013-07-02 71 views
0

我有一個列表:scope_list = ['prd1 rls1', ' prd1 rls1 rls3 rls2']動態查詢過濾

我想創建一個基於scope_list一個過濾器,在SQL會是什麼樣子:

(product=prd1 AND `release` in (rls1)) OR (product=prd1 AND release in (rls1 ,rls3, rls2)) 

明知值的數量scope_list各不相同,我以前不能知道它。這就是爲什麼我想從scope_list動態管理過濾器的原因。

在SQL鍊金術我想我應該做這樣的事情:

session.query(my_table).filter(or_(and_(my_table.product==%s,mytable.release.in_(%s))) for element.split() in scope_list) 

我剛開始學習SQL鍊金術,任何幫助,將不勝感激。

回答

7

or_and_都可以採用可變數量的位置參數,所以如果您構建一個列表,您可以將它作爲位置參數傳遞給or_(*or_args)

# First I split each term in the scope list. 
scope_list = [term.split() for term in scope_list] 
# Then the query is built. 
or_args = [and_(
    my_table.product == scope[0], 
    my_table.release.in_(scope[1:])) for scope in scope_list] 
results = session.query(my_table).filter(or_(*or_args)).all()