2013-07-02 68 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()