J'utilise Flask-SQLAlchemy pour interroger une base de données d'utilisateurs; cependant, alors que
user = models.User.query.filter_by(username="ganye").first()
reviendra
<User u'ganye'>
faire
user = models.User.query.filter_by(username="GANYE").first()
résultats
None
Je me demande s’il existe un moyen d’interroger la base de données sans tenir compte de la casse, afin que le deuxième exemple retourne quand même
<User u'ganye'>
Vous pouvez le faire en utilisant les fonctions lower
ou upper
de votre filtre:
from sqlalchemy import func
user = models.User.query.filter(func.lower(User.username) == func.lower("GaNyE")).first()
Une autre option est de faire une recherche en utilisant ilike
au lieu de like
:
.query.filter(Model.column.ilike("ganye"))
En améliorant la réponse de @ plaes, celle-ci raccourcira la requête si vous ne spécifiez que 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ù l'on aurait besoin d'utiliser le jsonify de Flask à des fins AJAX) puis d'y accéder en javascript à l'aide de data.result:
from flask import jsonify
jsonify(result=user)
tu peux faire
user = db.session.query(User).filter_by(func.lower(User.username)==func.lower("GANYE")).first()
Ou vous pouvez utiliser la fonction ilike
user = db.session.query(User).filter_by(User.username.ilike("%ganye%")).first()