如何组合两列并应用过滤器?例如,我希望同时在“ firstname”和“ lastname”列中搜索。如果只搜索一列,我是这样做的:
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
您可以使用 SQLAlchemy 的 or_功能在多个列中进行搜索(为了与 Python 自己的 or区分开来,需要使用下划线)。
or_
or
这里有一个例子:
from sqlalchemy import or_ query = meta.Session.query(User).filter(or_(User.firstname.like(searchVar), User.lastname.like(searchVar)))
你可以简单地多次调用 filter:
filter
query = meta.Session.query(User).filter(User.firstname.like(searchVar1)). \ filter(User.lastname.like(searchVar2))
有很多方法可以做到这一点:
Using filter() (还有 operator)
filter()
query = meta.Session.query(User).filter( User.firstname.like(search_var1), User.lastname.like(search_var2) )
使用 filter_by()(and操作符)
filter_by()
query = meta.Session.query(User).filter_by( firstname.like(search_var1), lastname.like(search_var2) )
链接 filter()或 filter_by()(还有操作员)
query = meta.Session.query(User).\ filter_by(firstname.like(search_var1)).\ filter_by(lastname.like(search_var2))
使用 or_()、 and_()和 not()
or_()
and_()
not()
from sqlalchemy import and_, or_, not_ query = meta.Session.query(User).filter( and_( User.firstname.like(search_var1), User.lastname.like(search_var2) ) )
一段适用于多列的通用代码。 如果需要在应用程序中有条件地实现搜索功能,也可以使用这种方法。
search_key = 'abc' search_args = [col.ilike('%%%s%%' % search_key) for col in ['col1', 'col2', 'col3']] query = Query(table).filter(or_(*search_args)) session.execute(query).fetchall()
注意: 跳过% 格式化查询时,%%非常重要。
%%