@nvlveu

Функции func.lower() и ilike не работают с кириллицей?

Есть модель пользователя в базе данных с полем имени. Я пытаюсь найти всех пользователей с определённым именем. Проблема в том, что
User.query.filter(sqlalchemy.func.lower(User.name) == ...

и
User.query.filter(User.name.ilike(...
не работают с кириллицей, а с латиницей всё нормально.
  • Вопрос задан
  • 482 просмотра
Решения вопроса 1
@nvlveu Автор вопроса
https://stackoverflow.com/questions/68147587/regis... используя это, как источник новых знаний, можно переопределить func.lower:
...

import sqlalchemy


def _lower(arg: str) -> str:
    return arg.lower()


@sqlalchemy.event.listens_for(db.engine, "connect")
def on_connect(dbapi_connection, connection_record):
    dbapi_connection.create_function("lower", 1, _lower)

Теперь func.lower работает и с латинскими буквами, и с кириллицей

Изменено
Более оптимизированное решение:
1. Устанавливаем sqlite-icu (https://pypi.org/project/sqlite-icu/): pip install sqlite-icu
2. Подключаем sqlite-icu:
import sqlalchemy
import sqlite_icu


@sqlalchemy.event.listens_for(db.engine, "connect")
def on_connect(dbapi_connection, connection_record):
    dbapi_connection.load_extension(sqlite_icu.extension_path().replace(".so", ""))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы