Нечувствительный к регистру запрос Flask-SQLAlchemy

Я использую Flask-SQLAlchemy для запросов из базы данных пользователей; однако, пока

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

вернусь

<User u'ganye'>

делает

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

возвращается

None

Мне интересно, есть ли способ запросить базу данных без учета регистра, чтобы второй пример все равно возвращался

<User u'ganye'>

person Ganye    schedule 15.05.2013    source источник


Ответы (3)


Вы можете сделать это, используя функции lower или upper в вашем фильтре:

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

Другой вариант — выполнить поиск, используя ilike вместо like:

.query.filter(Model.column.ilike("ganye"))
person plaes    schedule 15.05.2013
comment
Сделает ли это запрос медленнее по сравнению с методом filter_by, где столбец имени пользователя индексируется? - person CaptainDaVinci; 24.07.2018
comment
ilike отлично справится с этой задачей, спасибо.. - person Biskrem Muhammad; 29.11.2020

Улучшая ответ @plaes, этот сделает запрос короче, если вы укажете только те столбцы, которые вам нужны:

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

Приведенный выше пример очень полезен, если нужно использовать jsonify Flask для целей AJAX, а затем в вашем javascript получить к нему доступ с помощью data.result:

from flask import jsonify
jsonify(result=user)
person iChux    schedule 11.05.2015
comment
@VedranŠego Я видел ссылку, спасибо за ссылку. Я также проведу свой собственный тест. - person iChux; 28.08.2018

ты можешь сделать

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

Или вы можете использовать функцию ilike

 user = db.session.query(User).filter_by(User.username.ilike("%ganye%")).first()
person Mohammad Aarif    schedule 08.05.2019
comment
Второй вариант не должен иметь процентов - person axwell; 20.04.2020