2010-07-26 10 views
37

Comment combiner deux colonnes et appliquer un filtre? Par exemple, je souhaite effectuer une recherche dans les colonnes "prénom" et "nom" en même temps. Voici comment je fais si la recherche seule colonne:sqlalchemy filtre plusieurs colonnes

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

Je pensais que cette question correspond au problème que j'ai, mais les réponses ne s'appliquent pas à mon scénario particulier. Si le prénom est "joe" et le nom de famille est "smith", je suis à la recherche d'une instruction de filtre qui apparaîtra lorsque le searchVar fourni est "joe smith". C'est-à-dire que les champs doivent être concaténés (avec espace ajouté) avant que le test ne soit effectué. On dirait un scénario très réel. – Groovee60

+0

@ Groovee60 C'est exactement ce que je recherche. J'apprécierais que vous puissiez partager votre solution, si vous en avez trouvé une. – Lilylakshi

Répondre

42

Vous pouvez utiliser pour rechercher dans plus d'une colonne de SQLAlchemy or_ function (le trait de soulignement est nécessaire de distinguer de Python propre or).

Voici un exemple:

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

Vous pouvez utiliser l'opérateur '|' à la place de 'or_', comme ceci -' (User.firstname.like (searchVar)) | (User.lastname.like (searchVar)) ', cependant vous devriez faire attention avec la précédence' | ', sans parenthèse il peut produire des résultats TRÈS inattendus quand il est mélangé avec des opérateurs comparsion. –

+1

Cela ne devrait-il pas être 'filter.or_ (case1, case 2)'? – fedorqui

+1

Ceci est faux, car la question concerne ORM mais le lien mène à des expressions. – user2846569

38

Vous pouvez simplement appeler filter plusieurs fois:

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

Y a-t-il une différence de performance entre utiliser plusieurs méthodes 'filter()' et utiliser la combinaison de plusieurs conditions (par 'or_' ou' and_') dans un seul 'filter', sur de grandes tables mysql? – Sangram

+2

Est-ce que plusieurs appels 'filter' agiraient comme un' AND' logique plutôt qu'un 'OR'? – danodonovan

+5

ce serait ET –

10

Il y a plusieurs façons de le faire:

Utiliser le filtre (et opérateur)

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

L'utilisation filter_by (et opérateur)

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

filtre Chaînage (et opérateur)

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

En utilisant or_() ou et_() et 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

Y a-t-il des différences de performance remarquables pour ces différentes approches? – Miek

Questions connexes