2010-07-26 2 views
37

Come si combinano due colonne e si applica il filtro? Ad esempio, voglio cercare contemporaneamente nelle colonne "firstname" e "lastname". Ecco come ho fatto, se la ricerca una sola colonna:sqlalchemy filter multiple columns

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

ho pensato che questa domanda corrisponde al problema che ho, ma le risposte non si applicano al mio particolare scenario. Se firstname è "joe" e lastname è "smith", sto cercando una dichiarazione di filtro che corrisponda quando il searchVar fornito è "joe smith". Ad esempio, i campi devono essere concatenati (con lo spazio aggiunto) prima che venga effettuato il test. Sembra uno scenario del mondo reale. – Groovee60

+0

@ Groovee60 Questo è esattamente quello che sto cercando. Gradirei se tu fossi in grado di condividere la tua soluzione, se ne hai trovata una. – Lilylakshi

risposta

42

È possibile utilizzare SQLAlchemy di or_ function per la ricerca in più di una colonna (la sottolineatura è necessaria una differenziazione da Python proprio or).

Ecco un esempio:

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

Puoi usare l'operatore '|' invece di 'or_', come questo -' (User.firstname.like (searchVar)) | (User.lastname.like (searchVar)) ', tuttavia si dovrebbe fare attenzione con la precedenza' | ', senza parentesi essa può produrre risultati MOLTO inaspettati se combinata con operatori di comparsion. –

+1

Non dovrebbe essere 'filter.or_ (case1, case 2)'? – fedorqui

+1

Questo è sbagliato, poiché la domanda riguarda ORM ma il collegamento conduce alle espressioni. – user2846569

38

Si può semplicemente chiamare filter più volte:

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

c'è qualche differenza di prestazioni tra l'utilizzo di più metodi 'filter()' e l'uso di più condizioni (da 'or_' o' and_') in un singolo 'filtro', su grandi tabelle mysql? – Sangram

+2

Più chiamate 'filter' si comportano come un' AND' logico piuttosto che un 'OR'? – danodonovan

+5

sarebbe AND –

10

Ci sono diversi modi per farlo:

inserimento del filtro (e gestore)

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

Utilizzando filter_by (e operatore)

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

concatenazione filtro (e operatore)

query = meta.Session.query(User).\ 
    filter_by(firstname.like(search_var1)).\ 
    filter_by(lastname.like(search_var2)) 

Utilizzando or_() o and_() e non()

from sqlalchemy import and_, or_, not_ 

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

Esistono differenze di prestazioni degne di nota per questi diversi approcci? – Miek