Zapytanie Flask-SQLAlchemy bez rozróżniania wielkości liter

98

Używam Flask-SQLAlchemy do wykonywania zapytań z bazy danych użytkowników; jednak, podczas gdy

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

wróci

<User u'ganye'>

robić

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

zwroty

None

Zastanawiam się, czy istnieje sposób na zapytanie bazy danych w sposób niewrażliwy na wielkość liter, tak aby drugi przykład nadal zwracał

<User u'ganye'>
Ganye
źródło

Odpowiedzi:

200

Możesz to zrobić za pomocą funkcji lowerlub upperw filtrze:

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

Inną opcją jest wyszukiwanie za pomocą ilikezamiast like:

.query.filter(Model.column.ilike("ganye"))
plaes
źródło
3
Czy spowolniłoby to zapytanie w porównaniu z filter_bymetodą, w której indeksowana jest kolumna nazwy użytkownika?
CaptainDaVinci
13

Poprawiając odpowiedź @ plaes, ta skróci zapytanie, jeśli określisz tylko kolumny, których potrzebujesz:

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

Powyższy przykład jest bardzo przydatny w przypadku, gdy trzeba użyć jsonify Flask do celów AJAX, a następnie w swoim javascript uzyskać do niego dostęp za pomocą data.result :

from flask import jsonify
jsonify(result=user)
iChux
źródło
@ VedranŠego Widziałem link, dzięki za odniesienie. Wykonam również własny test.
iChux
3

możesz to zrobić

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

Lub możesz skorzystać z funkcji ilike

 user = db.session.query(User).filter_by(User.username.ilike("%ganye%")).first()
Mohammad Aarif
źródło
Druga opcja nie powinna mieć wartości procentowych
axwell