2010-07-26 2 views
37

Как объединить два столбца и применить фильтр? Например, я хочу одновременно выполнять поиск в столбцах «firstname» и «lastname». Вот как я делал это, если поиск только один столбец:sqlalchemy фильтр несколько столбцов

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

Я думал, что этот вопрос соответствует моей проблеме, но ответы не применяются к моему конкретному сценарию. Если firstname является «joe», а lastname - «smith», я ищу оператор фильтра, который будет соответствовать, когда предоставленный searchVar является «joe smith». I.e, перед проведением теста поля должны быть объединены (с добавленным пространством). Это похоже на очень реальный сценарий. – Groovee60

+0

@ Groovee60 Это именно то, что я ищу. Буду признателен, если вы сможете поделиться своим решением, если найдете его. – Lilylakshi

ответ

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)) ', однако вы должны быть осторожны с приоритетом' | ', без круглых скобок он может производить ОЧЕНЬ неожиданные результаты, когда они смешиваются с операторами сравнения. –

+1

Не должно быть 'filter.or_ (case1, case 2)'? – fedorqui

+1

Это неправильно, поскольку вопрос об ORM, но ссылка приводит к выражениям. – user2846569

38

Вы можете просто позвонить filter несколько раз:

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

есть ли разница в производительности между несколькими методами 'filter()' и с использованием комбинации нескольких условий (по 'or_' или' and_') в одном 'filter', на больших таблицах mysql? – Sangram

+2

Будут ли несколько вызовов 'filter' действовать как логические' AND', а не 'OR'? – danodonovan

+5

было бы И –

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