过滤多列

如何组合两列并应用过滤器?例如,我希望同时在“ firstname”和“ lastname”列中搜索。如果只搜索一列,我是这样做的:

query = meta.Session.query(User).filter(User.firstname.like(searchVar))
186470 次浏览

您可以使用 SQLAlchemy 的 or_功能在多个列中进行搜索(为了与 Python 自己的 or区分开来,需要使用下划线)。

这里有一个例子:

from sqlalchemy import or_
query = meta.Session.query(User).filter(or_(User.firstname.like(searchVar),
User.lastname.like(searchVar)))

你可以简单地多次调用 filter:

query = meta.Session.query(User).filter(User.firstname.like(searchVar1)). \
filter(User.lastname.like(searchVar2))

有很多方法可以做到这一点:

Using filter() (还有 operator)

query = meta.Session.query(User).filter(
User.firstname.like(search_var1),
User.lastname.like(search_var2)
)

使用 filter_by()(and操作符)

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()

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()

注意: 跳过% 格式化查询时,%%非常重要。