我有一个SQLAlchemy Model属性列表。例如:
my_list = ['firstName', 'lastName']
我还有一个具有firstName and lastName
属性的SQLAlchemy对象。
我想搜索查询我的数据库以查找具有查询的人员,如下所示:
session.filter( Person.lastName.like(query+'%') | Person.firstName.like(query+'%')).all()
棘手的部分是我想从my_list
列表动态生成上述过滤器。例如,如果将emailAddress
添加到列表中,我希望查询也通过对象电子邮件属性进行搜索。
答案 0 :(得分:1)
使用SQLAlchemy,如果您了解reduce
,这很容易。使用getattr
从Person
类中获取动态命名的列。
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)