Answers:
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'))
type(model.column_name == 'asdf')
→sqlalchemy.sql.elements.BinaryExpression
.filter
。如查询id=12345
,query(users).filter(id == id)
将不过滤的users.id
。相反,它将评估id == id
为True
并返回所有用户。您需要使用.filter(users.id == id)
(如上所述)。我今天早些时候犯了这个错误。
实际上,我们最初将它们合并在一起,也就是说,有一个类似“过滤器”的方法接受*args
和**kwargs
,您可以在其中传递SQL表达式或关键字参数(或两者)。我实际上发现这更方便,但是人们总是对此感到困惑,因为他们通常仍然会克服column == expression
和之间的区别keyword = expression
。所以我们将它们分开。
column == expression
vs keyword = expression
的观点是区别filter
和的关键filter_by
。谢谢!
filter_by
可能会比filter
。
filter_by
目的是能够为该类写出字段名,而不会提出任何问题-尽管flter
需要实际的列对象-通常将需要至少键入一个(或读取)一个冗余的类名。因此,如果要按相等条件进行过滤,这将非常方便。
filter_by
使用关键字参数,而filter
允许使用pythonic过滤参数,例如filter(User.name=="john")
它是用于加快查询编写速度的语法糖。它以伪代码实现:
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
,可以用作缓存(与事务关联)
db.users.name=='Ryan'
从那以后不会一次评估一个常数然后变得毫无意义吗?似乎需要使用lambda才能起作用。