看看这个答案:Case Insensitive Flask-SQLAlchemy Query
为什么使用SQLAlchemy的func.lower(mystring)
代替python的原生mystring.lower()
更好?
答案 0 :(得分:5)
背景很重要。
user = models.User.query.filter(func.lower(User.username) == func.lower("GaNyE")).first()
这里没有要调用lower
方法的字符串;您正在编写要在数据库中执行的SQL命令。 func.lower
不会返回小写字符串;它返回一个对象,该对象表示可用于生成小写字符串的SQL代码。
正如mgilson指出的那样,没有必要在实际的Python值上使用func.lower
;它们对于应用过滤器的每一行都是常量,但我不确定SQLAlchemy是否能够检测和优化这种情况。以下任何一种
user = models.User.query.filter(func.lower(User.username) == "ganye").first()
user = models.User.query.filter(func.lower(User.username) == "GaNyE".lower()).first()
会产生类似lower(username) = :lower_1
而不是lower(username) = lower(:lower_1)
的SQL代码,这可以通过消除对每行的lower
调用来提高SQL查询的效率。