Büyük / Küçük Harfe Duyarlı Olmayan Flask-SQLAlchemy Sorgusu


98

Kullanıcı veritabanından sorgulama yapmak için Flask-SQLAlchemy kullanıyorum; ancak

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

dönecek

<User u'ganye'>

yapmak

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

İadeler

None

Veritabanını büyük / küçük harfe duyarlı olmayan bir şekilde sorgulamanın bir yolu olup olmadığını merak ediyorum, böylece ikinci örnek yine de dönecek

<User u'ganye'>

Yanıtlar:


200

Filtrenizdeki lowerveya upperişlevlerini kullanarak bunu yapabilirsiniz :

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

Başka bir seçenek kullanarak arama yapmaktır ilikeyerine like:

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

3
Bu, sorguyu filter_bykullanıcı adı sütununun dizine eklendiği yönteme göre daha yavaş yapar mı?
CaptainDaVinci

13

@ Plaes'in cevabını geliştirerek, bu, yalnızca ihtiyacınız olan sütunları belirtirseniz sorguyu kısaltacaktır:

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

Yukarıdaki örnek, AJAX amaçları için Flask'ın jsonify'ını kullanmanız ve ardından javascript'inizde data.result'u kullanarak ona erişmeniz gerektiğinde çok yararlıdır :

from flask import jsonify
jsonify(result=user)

@ VedranŠego Bağlantıyı gördüm, referans için teşekkürler. Ben de kendi testimi yapacağım.
iChux

3

yapabilirsin

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

Ya da ilike işlevini kullanabilirsiniz

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

İkinci seçeneğin yüzdesi olmamalıdır
axwell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.