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


98

Я использую 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'>

Ответы:


200

Вы можете сделать это, используя функции 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"))

3
Сделает ли это запрос медленнее по сравнению с filter_byметодом, в котором индексируется столбец имени пользователя?
CaptainDaVinci

13

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

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

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

from flask import jsonify
jsonify(result=user)

@ VedranŠego Я видел ссылку, спасибо за ссылку. Я также проведу свой собственный тест.
iChux

3

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

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()

У второго варианта не должно быть процентов
Axwell
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.