[英]Case Insensitive Flask-SQLAlchemy Query
我正在使用 Flask-SQLAlchemy 從用戶數據庫中查詢; 然而,同時
user = models.User.query.filter_by(username="ganye").first()
將返回
<User u'ganye'>
正在做
user = models.User.query.filter_by(username="GANYE").first()
回報
None
我想知道是否有辦法以不區分大小寫的方式查詢數據庫,以便第二個示例仍會返回
<User u'ganye'>
您可以通過使用過濾器中的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"))
改進@plaes 的答案,如果您只指定所需的列,這個答案將使查詢更短:
user = models.User.query.with_entities(models.User.username).\
filter(models.User.username.ilike("%ganye%")).all()
如果需要將 Flask 的 jsonify 用於 AJAX 目的,然后在您的 javascript 中使用data.result訪問它,則上面的示例非常有用:
from flask import jsonify
jsonify(result=user)
你可以做
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()
如果它適合您的用例,您可以考慮在列上設置自定義排序規則<\/a>,以便該列以不區分大小寫的方式自動處理比較。
值得注意的是:
排序規則也適用於ORDER BY<\/code>子句
<\/li>
此答案中未顯示<\/li>
換句話說,在使用此功能之前,請查閱您的 RDBMS 文檔。
這個示例腳本展示了如何對 MySQL、Postgresql(注意特殊情況)和 Sqlite 使用排序規則; 每個 RDBMS 返回查詢值的所有三個可能結果。
我認為最好的解決方案是
func.lower(User.username).contains(username.lower())
它將產生 sql 像
WHERE (lower(user.username) LIKE '%%' || %s || '%%')
這意味着您的數據庫username
名將被轉換為小寫,您的 python 值username
也將被轉換為小寫。 所以現在你不必擔心區分大小寫
如果您的username
是Sara Smith
這將適用於ara
、 sar
、 Sara
或事件a S
uname = "ganye" user = models.User.query.filter(User.username.ilikef(f"%{uname}%").first()
return db.session.query(Post).filter( Post.title.ilike(f"%{search_query}%") | Post.body.ilike(f"%{search_query}%") )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.