2013-05-15 15 views
59

Ich benutze Flask-SQLAlchemy zur Abfrage von einer Datenbank von Benutzern; jedoch währendCase Insensitive Flask-SQLAlchemy Abfrage

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

kehrt

<User u'ganye'> 

tun

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

kehrt

None 

Ich frage mich, ob es einen Weg gibt, um die Datenbank in einem Fall abfragen unempfindlich, so dass der zweite Beispiel le kehrt noch

<User u'ganye'> 

Antwort

110

Sie können es tun, indem Sie entweder die lower oder upper Funktionen in Ihrem Filter:

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

Eine weitere Option ist mit ilike statt like zu tun Suche:

.query.filter(Model.column.ilike("ganye")) 
3

Verbesserung der @ plaes-Antwort, diese wird die Abfrage kürzer machen, wenn Sie nur die Spalte (n) angeben Sie brauchen:

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

Das obige Beispiel ist man braucht sehr nützlich im Falle Flask des jsonify für AJAX Zwecke zu verwenden und dann in Ihrem Javascript-Zugriff über das data.result:

from flask import jsonify 
jsonify(result=user) 
+0

'ilike' möglicherweise langsamer: https://StackOverflow.com/a/20336666/1667018 –