动态或使用SQLAlchemy过滤

时间:2015-03-08 08:31:27

标签: python sqlalchemy

我有一个SQLAlchemy Model属性列表。例如:

my_list = ['firstName', 'lastName']

我还有一个具有firstName and lastName属性的SQLAlchemy对象。

我想搜索查询我的数据库以查找具有查询的人员,如下所示: session.filter( Person.lastName.like(query+'%') | Person.firstName.like(query+'%')).all()

棘手的部分是我想从my_list列表动态生成上述过滤器。例如,如果将emailAddress添加到列表中,我希望查询也通过对象电子邮件属性进行搜索。

1 个答案:

答案 0 :(得分:1)

使用SQLAlchemy,如果您了解reduce,这很容易。使用getattrPerson类中获取动态命名的列。

from functools import reduce  # python 3
from operator import or_

columns = [ 'firstName', 'lastName' ]

# make a list of `Person.c.like(query+'%')`
likes = [ getattr(Person, c).like(query+'%') for c in column ]

# join them with | using reduce; does the same as likes[0]|likes[1]|....
final_filter = reduce(or_, likes)

session.filter(final_filter).all()

虽然or_也同时接受or的任意数量的子句,所以你也可以使用参数解包:

 final_filter = or_(*likes)