2010-07-26 88 views
37

如何合并两列并应用过滤器?例如,我想同时搜索“名字”和“姓氏”列。这里是我是如何被做,如果只搜索一列:sqlalchemy过滤多列

query = meta.Session.query(User).filter(User.firstname.like(searchVar)) 
+3

我认为这个问题符合我的问题,但答案不适用于我的特定情况。如果firstname是“joe”而lastname是“smith”,那么我正在寻找一个过滤器语句,当提供的searchVar是“joe smith”时它将匹配。即,在进行测试之前,需要将这些字段连接起来(并添加空格)。看起来像一个非常真实的场景。 – Groovee60 2015-05-13 15:12:09

+0

@ Groovee60这正是我正在寻找的。如果你能分享你的解决方案,如果你找到了解决方案,我将不胜感激。 – Lilylakshi 2017-05-30 11:17:37

回答

42

您可以使用SQLAlchemy的or_ function在多个列搜索(下划线是需要从Python的or区别)。

下面是一个例子:

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

您可以使用'|'运算符而不是'or_',就像这样 - '(User.firstname.like(searchVar))| (User.lastname.like(searchVar))',但是你应该小心使用'|'优先级,没有括号,当与比较运算符混合时,它会产生非常意想不到的结果。 – 2010-08-01 17:05:57

+1

不应该是'filter.or_(case1,case 2)'? – fedorqui 2013-05-23 09:09:10

+1

这是错误的,因为问题是关于ORM,但链接导致表达式。 – user2846569 2015-02-19 08:52:35

38

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

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

在大型mysql表中使用多个'filter()'方法并在单个'filter'中使用多个条件(通过'or_'或'and_')之间是否存在任何性能差异? – Sangram 2014-07-28 09:12:02

+2

多个“过滤器”调用是否像逻辑“AND”而不是“OR”一样? – danodonovan 2015-06-09 10:15:54

+5

这将是AND – 2015-06-15 19:52:35

10

有办法做到这一点编号:

使用过滤器(和运营商)

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) 
    ) 
) 
+0

这些不同的方法有什么值得注意的性能差异吗? – Miek 2018-03-11 00:23:33