Нечутливий до регістру запит Flask-SQLAlchemy Query


96

Я використовую 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'>

Відповіді:


193

Ви можете зробити це, використовуючи 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()

Наведений вище приклад дуже корисний у випадку, якщо потрібно використовувати jsonify Flask для цілей 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.