sqlalchemy过滤多列
如何合并两列并应用过滤器?例如,我想同时搜索“名字”和“姓氏”列。这里是我是如何被做,如果只搜索一列:sqlalchemy过滤多列
query = meta.Session.query(User).filter(User.firstname.like(searchVar))
您可以使用SQLAlchemy的or_
function在多个列搜索(下划线是需要从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))',但是你应该小心使用'|'优先级,没有括号,当与比较运算符混合时,它会产生非常意想不到的结果。 – 2010-08-01 17:05:57
不应该是'filter.or_(case1,case 2)'? – fedorqui 2013-05-23 09:09:10
这是错误的,因为问题是关于ORM,但链接导致表达式。 – user2846569 2015-02-19 08:52:35
你可以简单地调用filter
多次:
query = meta.Session.query(User).filter(User.firstname.like(searchVar1)). \
filter(User.lastname.like(searchVar2))
在大型mysql表中使用多个'filter()'方法并在单个'filter'中使用多个条件(通过'or_'或'and_')之间是否存在任何性能差异? – Sangram 2014-07-28 09:12:02
多个“过滤器”调用是否像逻辑“AND”而不是“OR”一样? – danodonovan 2015-06-09 10:15:54
这将是AND – 2015-06-15 19:52:35
有办法做到这一点编号:
使用过滤器(和运营商)
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)
)
链接过滤器(和运营商)
query = meta.Session.query(User).\
filter_by(firstname.like(search_var1)).\
filter_by(lastname.like(search_var2))
使用or_()或and_(),而不是()
from sqlalchemy import and_, or_, not_
query = meta.Session.query(User).filter(
and_(
User.firstname.like(search_var1),
User.lastname.like(search_var2)
)
)
这些不同的方法有什么值得注意的性能差异吗? – Miek 2018-03-11 00:23:33
我认为这个问题符合我的问题,但答案不适用于我的特定情况。如果firstname是“joe”而lastname是“smith”,那么我正在寻找一个过滤器语句,当提供的searchVar是“joe smith”时它将匹配。即,在进行测试之前,需要将这些字段连接起来(并添加空格)。看起来像一个非常真实的场景。 – Groovee60 2015-05-13 15:12:09
@ Groovee60这正是我正在寻找的。如果你能分享你的解决方案,如果你找到了解决方案,我将不胜感激。 – Lilylakshi 2017-05-30 11:17:37