我如何将两列合并并应用筛选条件?例如,我想同时在“firstname”和“lastname”这两列中搜索。以下是我仅搜索一列的做法:
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
我如何将两列合并并应用筛选条件?例如,我想同时在“firstname”和“lastname”这两列中搜索。以下是我仅搜索一列的做法:
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
有多种方法可以做到这一点:
使用filter()
函数(和运算符)
query = meta.Session.query(User).filter(
User.firstname.like(search_var1),
User.lastname.like(search_var2)
)
使用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()
from sqlalchemy import and_, or_, not_
query = meta.Session.query(User).filter(
and_(
User.firstname.like(search_var1),
User.lastname.like(search_var2)
)
)
您可以简单地多次调用filter
:
query = meta.Session.query(User).filter(User.firstname.like(searchVar1)). \
filter(User.lastname.like(searchVar2))
filter()
方法和在单个filter
中使用多个条件的组合(通过or_
或and_
)之间是否存在性能差异? - exAresfilter
调用会像逻辑上的“与”而不是“或”一样起作用吗? - danodonovan您可以使用SQLAlchemy的or_
函数在多个列中进行搜索(下划线是必须的,以区分它与Python自己的or
)。
这里是一个例子:
from sqlalchemy import or_
query = meta.Session.query(User).filter(or_(User.firstname.like(searchVar),
User.lastname.like(searchVar)))
|
运算符代替 or_
,像这样 - (User.firstname.like(searchVar)) | (User.lastname.like(searchVar))
,但你需要小心 |
的优先级,如果与比较运算符混合使用时没有括号,它可能会产生非常意外的结果。 - Daniel Kluevfilter.or_(case1, case2)
吗? - fedorqui一段通用的代码,适用于多个列。如果应用程序需要有条件地实现搜索功能,则也可以使用此代码。
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()
%%
在跳过查询中的%格式时非常重要。为了使过滤器适用于全名,您可以修改查询以使用数据库引擎提供的concat
函数。以下是如何更新您的代码以使其正常工作的示例:
from sqlalchemy import func
query = meta.Session.query(User).filter(func.concat(User.firstname, ' ', User.lastname).contains(searchVar))