SQLAlchemy中filter和filter_by的区别是什么?

时间:2010-01-24 19:49:46

标签: python sqlalchemy

有人能解释SQLAlchemy中filterfilter_by函数之间的区别吗?我很困惑,不能真正看到差异。我应该使用哪一个?

5 个答案:

答案 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 == expressionkeyword = 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() 一样使用(当 == 使用时)。

只是要记住这两个函数在参数类型方面有不同的语法。