Consulta Frasco insensível a maiúsculas e minúsculas-SQLAlchemy

96

Estou usando o Flask-SQLAlchemy para consultar um banco de dados de usuários; entretanto, enquanto

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

retornará

<User u'ganye'>

fazendo

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

retorna

None

Eu estou me perguntando se existe uma maneira de consultar o banco de dados de forma insensível a maiúsculas e minúsculas, para que o segundo exemplo ainda retorne

<User u'ganye'>
Ganye
fonte

Respostas:

193

Você pode fazer isso usando as funções lowerou upperem seu filtro:

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

Outra opção é fazer pesquisas usando em ilikevez de like:

.query.filter(Model.column.ilike("ganye"))
plaes
fonte
3
Isso tornaria a consulta mais lenta em comparação com o filter_bymétodo em que a coluna de nome de usuário é indexada?
CaptainDaVinci
13

Melhorando a resposta de @plaes, isso tornará a consulta mais curta se você especificar apenas a (s) coluna (s) de que precisa:

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

O exemplo acima é muito útil caso seja necessário usar o jsonify do Flask para fins AJAX e, em seguida, em seu javascript, acesse-o usando data.result :

from flask import jsonify
jsonify(result=user)
iChux
fonte
@ VedranŠego Eu vi o link, obrigado pela referência. Também farei meu próprio teste.
iChux
3

você pode fazer

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

Ou você pode usar a função ilike

 user = db.session.query(User).filter_by(User.username.ilike("%ganye%")).first()
Mohammad Aarif
fonte
A segunda opção não deve ter porcentagens
axwell