SQLAlchemy中filter和filter_by之间的区别


304

谁能解释SQLAlchemy filterfilter_by函数之间的区别?我应该使用哪一个?

Answers:


393

filter_by 用于使用常规kwarg对列名称进行简单查询,例如

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'))


22
这是如何工作的?db.users.name=='Ryan'从那以后不会一次评估一个常数然后变得毫无意义吗?似乎需要使用lambda才能起作用。
Hamish Grubijan

46
等式运算符超载
Daniel Velkov

9
type(model.column_name == 'asdf')sqlalchemy.sql.elements.BinaryExpression
尼克T

11
使用时要小心.filter。如查询id=12345query(users).filter(id == id)将不过滤的users.id。相反,它将评估id == idTrue并返回所有用户。您需要使用.filter(users.id == id)(如上所述)。我今天早些时候犯了这个错误。
Nico Cernek '19

118

实际上,我们最初将它们合并在一起,也就是说,有一个类似“过滤器”的方法接受*args**kwargs,您可以在其中传递SQL表达式或关键字参数(或两者)。我实际上发现这更方便,但是人们总是对此感到困惑,因为他们通常仍然会克服column == expression和之间的区别keyword = expression。所以我们将它们分开。


30
我认为您对column == expressionvs keyword = expression的观点是区别filter和的关键filter_by。谢谢!
Hollister

2
我是sqlalchemy的新手,所以如果这是一个愚蠢的问题,请原谅,但是filter_by()似乎也不允许非常简单的条件,例如“ price> = 100”。因此,如果只能将其用于最简单的条件(例如“ price = 100”),为什么还要使用filter_by()函数呢?
PawelRoman 2014年

18
因为人们喜欢
zzzeek 2014年

3
它们之间是否有性能差异?我当时以为那filter_by可能会比filter
Devi 2015年

6
使用的filter_by目的是能够为该类写出字段名,而不会提出任何问题-尽管flter需要实际的列对象-通常将需要至少键入一个(或读取)一个冗余的类名。因此,如果要按相等条件进行过滤,这将非常方便。
jsbueno


34

它是用于加快查询编写速度的语法糖。它以伪代码实现:

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'))

您也可以通过PK直接通过get方法获取对象:

Users.query.get(123)
# And even by a composite PK
Users.query.get(123, 321)

使用get案例时,重要的是对象可以在没有数据库请求的情况下返回identity map,可以用作缓存(与事务关联)


这些代码示例具有误导性:声明性基表类和实例既没有过滤器也没有查询方法。他们使用会话。
乌龟很可爱

我转载users.filter自先前的答案。可能是我的错:) query属性是query_property及其当今的标准糖
enomad
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.