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'>

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

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)

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

A segunda opção não deve ter porcentagens
axwell
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.