Abfrage ohne Berücksichtigung der Groß- und Kleinschreibung (SQLAlchemy)


96

Ich verwende Flask-SQLAlchemy, um aus einer Benutzerdatenbank abzufragen. jedoch während

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

wird zurückkehren

<User u'ganye'>

tun

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

kehrt zurück

None

Ich frage mich, ob es eine Möglichkeit gibt, die Datenbank ohne Berücksichtigung der Groß- und Kleinschreibung abzufragen, damit das zweite Beispiel weiterhin angezeigt wird

<User u'ganye'>

Antworten:


193

Sie können dies tun, indem Sie entweder die Funktionen loweroder upperin Ihrem Filter verwenden:

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

Eine weitere Option ist mit zu tun , die Suche ilikestatt like:

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

3
Würde dies die Abfrage langsamer machen als die filter_byMethode, bei der die Spalte mit dem Benutzernamen indiziert wird?
CaptainDaVinci

13

Durch die Verbesserung der Antwort von @ plaes wird die Abfrage kürzer, wenn Sie nur die Spalte (n) angeben, die Sie benötigen:

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

Das obige Beispiel ist sehr nützlich, wenn Sie Flask's jsonify für AJAX-Zwecke verwenden und dann in Ihrem Javascript mit data.result darauf zugreifen müssen :

from flask import jsonify
jsonify(result=user)

@ VedranŠego Ich habe den Link gesehen, danke für den Hinweis. Ich werde auch meinen eigenen Test durchführen.
iChux

3

du kannst tun

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

Oder Sie können die ilike-Funktion verwenden

 user = db.session.query(User).filter_by(User.username.ilike("%ganye%")).first()

Die zweite Option sollte keine Prozentsätze haben
Axwell
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.