Requête Flask-SQLAlchemy Insensible À La Casse

J'utilise Flask-SQLAlchemy pour interroger à partir d'une base de données d'utilisateurs; cependant, alors que

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

Retourne

<User u'ganye'>

Faire

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

Renvoie

None

Je me demande s'il existe un moyen d'interroger la base de données de manière insensible à la casse, de sorte que le deuxième exemple retournera toujours

<User u'ganye'>
74
demandé sur Ganye 2013-05-15 23:08:15

2 réponses

, Vous pouvez le faire en utilisant le lower ou upper fonctions de votre filtre:

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

Une autre option consiste à effectuer une recherche en utilisant ilike au lieu de like:

.query.filter(Model.column.ilike("ganye"))
138
répondu plaes 2016-03-18 13:42:36

En améliorant la réponse de @ plaes, celle - ci raccourcira la requête si vous spécifiez uniquement la ou les colonnes dont vous avez besoin:

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

L'exemple ci-dessus est très utile dans le cas où il faut utiliser Jsonify de Flask à des fins AJAX, puis dans votre javascript y accéder en utilisant les données .résultat:

from flask import jsonify
jsonify(result=user)
5
répondu iChux 2016-09-26 13:09:31