filter
filter_by
filter_by用于使用常规kwargs对列名进行简单查询,例如
db.users.filter_by(name='Joe')
同样可以用filter实现,不使用kwargs,而是使用'=='相等操作符,该操作符已在db.users.name对象上重载:
db.users.filter(db.users.name=='Joe')
你也可以使用filter编写更强大的查询,比如表达式:
db.users.filter(or_(db.users.name=='Ryan', db.users.country=='England'))
filter_by使用关键字参数,而filter允许像filter(User.name=="john")这样的python过滤参数
filter(User.name=="john")
实际上,我们最初是将它们合并在一起的,即有一个类似“过滤器”的方法,接受*args和**kwargs,在那里您可以传递一个SQL表达式或关键字参数(或两者)。实际上,我发现这样更方便,但人们总是对它感到困惑,因为他们通常还在克服column == expression和keyword = expression之间的差异。所以我们把它们分开。
*args
**kwargs
column == expression
keyword = expression
它是一种语法糖,用于更快地编写查询。它在伪代码中的实现:
def filter_by(self, **kwargs): return self.filter(sql.and_(**kwargs))
对于AND,你可以简单地写:
session.query(db.users).filter_by(name='Joe', surname='Dodson')
顺便说一句
session.query(db.users).filter(or_(db.users.name=='Ryan', db.users.country=='England'))
可以写成
session.query(db.users).filter((db.users.name=='Ryan') | (db.users.country=='England'))
你也可以通过get方法直接通过PK获取object:
get
Users.query.get(123) # And even by a composite PK Users.query.get(123, 321)
在使用get的情况下,重要的是对象可以返回,而不需要从identity map返回数据库请求,可以用作缓存(与事务关联)
identity map
除了之前发布的所有技术信息,filter ()和filter_by ()在可用性上有一个显著的区别。
第二个filter_by ()只能用于过滤特定的内容——字符串或某个数值。所以它只能用于类别筛选,而不能用于表达式筛选。
另一方面,filter ()允许使用比较表达式(==,<, >等),所以当需要'less/more than'过滤时,它是有帮助的。但是也可以像filter_by ()一样使用(当使用==时)。
记住这两个函数的参数类型有不同的语法。