Case Insensitive Flask-SQLAlchemy Query

Gan*_*nye 90 python flask flask-sqlalchemy

我正在使用Flask-SQLAlchemy从用户数据库中进行查询; 然而,同时

user = models.User.query.filter_by(username="ganye").first()
Run Code Online (Sandbox Code Playgroud)

将返回

<User u'ganye'>
Run Code Online (Sandbox Code Playgroud)

user = models.User.query.filter_by(username="GANYE").first()
Run Code Online (Sandbox Code Playgroud)

回报

None
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种方法以不区分大小写的方式查询数据库,因此第二个示例仍将返回

<User u'ganye'>
Run Code Online (Sandbox Code Playgroud)

pla*_*aes 171

您可以使用过滤器中的lowerupper函数来执行此操作:

from sqlalchemy import func
user = models.User.query.filter(func.lower(User.username) == func.lower("GaNyE")).first()
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用ilike而不是like:

.query.filter(Model.column.ilike("ganye"))
Run Code Online (Sandbox Code Playgroud)

  • 与将用户名列编入索引的“ filter_by”方法相比,这会使查询速度变慢吗? (2认同)

iCh*_*hux 9

改进@ plaes的答案,如果你只指定你需要的列,这个将缩短查询:

user = models.User.query.with_entities(models.User.username).\
filter(models.User.username.ilike("%ganye%")).all()
Run Code Online (Sandbox Code Playgroud)

上面的例子非常有用,如果需要使用Flask的jsonify用于AJAX目的,然后在你的javascript中使用data.result访问它:

from flask import jsonify
jsonify(result=user)
Run Code Online (Sandbox Code Playgroud)


Moh*_*rif 5

你可以做

user = db.session.query(User).filter_by(func.lower(User.username)==func.lower("GANYE")).first()
Run Code Online (Sandbox Code Playgroud)

或者你可以使用 ilike 功能

 user = db.session.query(User).filter_by(User.username.ilike("%ganye%")).first()
Run Code Online (Sandbox Code Playgroud)

  • 第二个选项不应有百分比 (3认同)
  • 你的意思是filter()而不是filter_by()吗?我认为 filter_by() 采用关键字,而不是表达式,根据 /sf/ask/148995381/ Between-filter-and-filter-by-in-sqlalchemy (2认同)