Consulta Flask-SQLAlchemy que no distingue entre mayúsculas y minúsculas

96

Estoy usando Flask-SQLAlchemy para consultar desde una base de datos de usuarios; sin embargo, mientras

user = models.User.query.filter_by(username="ganye").first()

volverá

<User u'ganye'>

haciendo

user = models.User.query.filter_by(username="GANYE").first()

devoluciones

None

Me pregunto si hay una manera de consultar la base de datos de una manera que no distinga entre mayúsculas y minúsculas, de modo que el segundo ejemplo aún regrese

<User u'ganye'>
Ganye
fuente

Respuestas:

193

Puede hacerlo usando las funciones lowero upperen su filtro:

from sqlalchemy import func
user = models.User.query.filter(func.lower(User.username) == func.lower("GaNyE")).first()

Otra opción es hacer una búsqueda usando en ilikelugar de like:

.query.filter(Model.column.ilike("ganye"))
plaes
fuente
3
¿Esto haría que la consulta fuera más lenta en comparación con el filter_bymétodo en el que se indexa la columna de nombre de usuario?
CaptainDaVinci
13

Mejorando la respuesta de @ plaes, esta hará que la consulta sea más corta si especifica solo la (s) columna (s) que necesita:

user = models.User.query.with_entities(models.User.username).\
filter(models.User.username.ilike("%ganye%")).all()

El ejemplo anterior es muy útil en caso de que uno necesite usar jsonify de Flask para propósitos de AJAX y luego en su javascript acceda usando data.result :

from flask import jsonify
jsonify(result=user)
iChux
fuente
@ VedranŠego He visto el enlace, gracias por la referencia. También realizaré mi propia prueba.
iChux
3

tu puedes hacer

user = db.session.query(User).filter_by(func.lower(User.username)==func.lower("GANYE")).first()

O puedes usar la función ilike

 user = db.session.query(User).filter_by(User.username.ilike("%ganye%")).first()
Mohammad Aarif
fuente
La segunda opción no debería tener porcentajes
axwell