有人能解释SQLAlchemy中filter
和filter_by
函数之间的区别吗?我很困惑,不能真正看到差异。我应该使用哪一个?
答案 0 :(得分:310)
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'))
答案 1 :(得分:107)
我们实际上最初将这些合并在一起,即有一个类似“过滤器”的方法接受* args和** kwargs,你可以传递一个SQL表达式或关键字参数(或两者)。我实际上发现它更方便,但人们总是对它感到困惑,因为它们通常仍然克服了column == expression
和keyword = expression
之间的差异。所以我们将它们分开了。
答案 2 :(得分:32)
filter_by
使用关键字参数,而filter
允许pythonic过滤参数,如filter(User.name=="john")
答案 3 :(得分:27)
这是一种快速查询编写的语法糖。它在伪代码中的实现:
def filter_by(self, **kwargs):
return self.filter(sql.and_(**kwargs))
对于AND,你可以简单地写:
session.query(db.users).filter_by(name='Joe', surname='Dodson')
btw
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
方法直接获取对象:
Users.query.get(123)
# And even by a composite PK
Users.query.get(123, 321)
使用get
时,重要的是可以在没有identity map
的数据库请求的情况下返回该对象,该请求可以用作缓存(与事务相关联)
答案 4 :(得分:0)
除了之前发布的所有技术信息之外,filter() 和 filter_by() 在可用性方面存在显着差异。
第二个,filter_by(),可能仅用于按特定说明的内容进行过滤 - 字符串或某个数字值。所以它只能用于类别过滤,不能用于表达式过滤。
另一方面,filter() 允许使用比较表达式(==、<、> 等),因此它很有帮助,例如当需要“小于/大于”过滤时。但也可以像 filter_by() 一样使用(当 == 使用时)。
只是要记住这两个函数在参数类型方面有不同的语法。