Query Flask-SQLAlchemy senza distinzione tra maiuscole e minuscole


96

Sto usando Flask-SQLAlchemy per eseguire query da un database di utenti; tuttavia, mentre

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

sarà di ritorno

<User u'ganye'>

facendo

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

ritorna

None

Mi chiedo se esiste un modo per interrogare il database in modo insensibile al maiuscolo / minuscolo, in modo che il secondo esempio restituisca comunque

<User u'ganye'>

Risposte:


193

Puoi farlo utilizzando le funzioni lowero uppernel tuo filtro:

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

Un'altra opzione è eseguire la ricerca utilizzando ilikeinvece di like:

.query.filter(Model.column.ilike("ganye"))

3
Ciò renderebbe la query più lenta rispetto al filter_bymetodo in cui viene indicizzata la colonna del nome utente?
CaptainDaVinci

13

Migliorando la risposta di @ plaes, questa renderà la query più breve se specifichi solo le colonne di cui hai bisogno:

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

L'esempio sopra è molto utile nel caso in cui sia necessario utilizzare jsonify di Flask per scopi AJAX e quindi nel tuo javascript accedervi utilizzando data.result :

from flask import jsonify
jsonify(result=user)

@ VedranŠego ho visto il link, grazie per il riferimento. Eseguirò anche il mio test.
iChux

3

tu puoi fare

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

Oppure puoi usare la funzione simile

 user = db.session.query(User).filter_by(User.username.ilike("%ganye%")).first()

La seconda opzione non dovrebbe avere percentuali
axwell il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.