为什么要使用SqlAlchemy的func.lower(mystring)与mystring.lower()?

时间:2016-04-20 16:34:23

标签: python sqlalchemy flask-sqlalchemy

看看这个答案:Case Insensitive Flask-SQLAlchemy Query

为什么使用SQLAlchemy的func.lower(mystring)代替python的原生mystring.lower()更好?

1 个答案:

答案 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查询的效率。