簡體   English   中英

不區分大小寫的 Flask-SQLAlchemy 查詢

[英]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'>

您可以通過使用過濾器中的lowerupper函數來實現:

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()

我認為最好的解決方案是

func.lower(User.username).contains(username.lower())

它將產生 sql 像

WHERE (lower(user.username) LIKE '%%' || %s || '%%')

這意味着您的數據庫username名將被轉換為小寫,您的 python 值username也將被轉換為小寫。 所以現在你不必擔心區分大小寫

如果您的usernameSara Smith這將適用於arasarSara或事件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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM