116 votes

sqlalchemy filtre plusieurs colonnes

Comment combiner deux colonnes et appliquer un filtre ? Par exemple, je veux faire une recherche à la fois dans les colonnes "firstname" et "lastname". Voici comment je l'ai fait si je ne cherche qu'une seule colonne :

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

152voto

Vlad Bezden Points 5024

Il y a plusieurs façons de le faire :

Utilisation filter() (et opérateur)

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

Utilisation filter_by() (et opérateur)

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

Chaîne

filter() ou filter_by() (et opérateur)

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

Utilisation or_(), and_(), et not()

from sqlalchemy import and_, or_, not_

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

86voto

David Johnstone Points 10565

Vous pouvez simplement appeler filter plusieurs fois :

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

72voto

gclj5 Points 1286

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

En voici un exemple :

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

5voto

Un morceau de code générique qui fonctionnera pour plusieurs colonnes. Cela peut également être utilisé s'il est nécessaire d'implémenter conditionnellement la fonctionnalité de recherche dans l'application.

search_key = "abc"
search_args = [col.ilike('%%%s%%' % search_key) for col in ['col1', 'col2', 'col3']]
query = Query(table).filter(or_(*search_args))
session.execute(query).fetchall()

Remarque : les %% sont importants pour ignorer le formatage % de la requête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X