Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête de recherche basée sur IN insensible à la casse SQLAlchemy ?

Cela devrait compiler exactement...

query( models.Object )\
.filter( 
     sqlalchemy.func.upper( models.Object.fieldname )\
     .in_( (sqlalchemy.func.upper(foo) , sqlalchemy.func.upper(bar), ) )
)\
.all()
  1. vous pouvez également simplement passer du texte en majuscule. personnellement, je ferais in_( foo.uppercase() , bar.uppercase() )

  2. SqlAlchemy fonctionne avec le DBAPI pour transmettre les paramètres de liaison dans votre magasin de données principal. Traduction -- les valeurs sont automatiquement échappées.

si vous voulez faire une liste de chaînes, quelque chose comme ça devrait fonctionner

.in_( [ i.upper() for i in inputs ] )
.in_( [ sqlalchemy.func.upper(i) for i in inputs ] )

Je veux juste ajouter que si vous voulez optimiser ces sélections pour la vitesse, et que vous êtes sur Postgres ou Oracle, vous pouvez créer un 'index de fonction'

CREATE INDEX table_fieldname_lower_idx ON table(lower(fieldname))

le planificateur de requêtes (dans la base de données) saura utiliser ce lower(fieldname) index lors de la recherche par rapport à un lower(fieldname) requête.