大文字と小文字を区別しないFlask-SQLAlchemyクエリ


96

Flask-SQLAlchemyを使用してユーザーのデータベースからクエリを実行しています。ただし、

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

戻ります

<User u'ganye'>

している

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

戻り値

None

大文字と小文字を区別しない方法でデータベースにクエリを実行する方法があるかどうか疑問に思っているので、2番目の例でも返されます

<User u'ganye'>

回答:


193

フィルターでlowerまたはupper関数のいずれかを使用して実行できます。

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

別のオプションは、のilike代わりにを使用して検索を行うことですlike

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

3
これにより、filter_byユーザー名列にインデックスが付けられる方法と比較して、クエリが遅くなりますか?
CaptainDaVinci 2018

13

@plaesの回答を改善し、必要な列のみを指定すると、クエリが短くなります。

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

上記の例は、AJAXの目的でFlaskのjsonifyを使用し、JavaScriptでdata.resultを使用してアクセスする必要がある場合に非常に役立ちます。

from flask import jsonify
jsonify(result=user)

@VedranŠego参考にしていただき、ありがとうございます。自分でテストも行います。
iChux 2018

3

できるよ

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

または、ilike関数を使用できます

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

2番目のオプションにはパーセンテージを
含め
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.