Kueri Flask-SQLAlchemy Tidak Peka Huruf Besar-Kecil

97

Saya menggunakan Flask-SQLAlchemy untuk melakukan kueri dari database pengguna; Namun, sementara

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

akan kembali

<User u'ganye'>

perbuatan

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

kembali

None

Saya bertanya-tanya apakah ada cara untuk melakukan kueri database dengan cara yang tidak peka huruf besar / kecil, sehingga contoh kedua masih akan kembali

<User u'ganye'>
Ganye
sumber

Jawaban:

195

Anda dapat melakukannya dengan menggunakan fungsi loweratau upperdi filter Anda:

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

Opsi lainnya adalah melakukan penelusuran menggunakan ilikealih-alih like:

.query.filter(Model.column.ilike("ganye"))
plaes
sumber
3
Apakah ini akan membuat kueri lebih lambat dibandingkan dengan filter_bymetode di mana kolom nama pengguna diindeks?
CaptainDaVinci
13

Memperbaiki jawaban @ plaes, yang satu ini akan membuat kueri lebih pendek jika Anda hanya menentukan kolom yang Anda butuhkan:

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

Contoh di atas sangat berguna jika seseorang perlu menggunakan jsonify Flask untuk tujuan AJAX dan kemudian di javascript Anda mengaksesnya menggunakan data.result :

from flask import jsonify
jsonify(result=user)
iChux
sumber
@ VedranŠego Saya telah melihat tautannya, terima kasih atas referensinya. Saya juga akan melakukan tes saya sendiri.
iChux
3

Anda dapat melakukan

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

Atau Anda bisa menggunakan fungsi ilike

 user = db.session.query(User).filter_by(User.username.ilike("%ganye%")).first()
Mohammad Aarif
sumber
Opsi kedua seharusnya tidak memiliki persentase
axwell