Подтвердить что ты не робот

Запрос нечувствительной к флагом 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'>
4b9b3361

Ответ 1

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

Ответ 2

Улучшая ответ на @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)