SQLAlchemy 中 filter 和 filter_by 的区别
- 2025-02-25 09:07:00
- admin 原创
- 27
问题描述:
filter
有人能解释一下 SQLAlchemy 中和函数之间的区别filter_by
吗?我应该使用哪一个?
解决方案 1:
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'))
解决方案 2:
实际上,我们最初将它们合并在一起,即有一个类似“过滤器”的方法,它接受*args
和**kwargs
,您可以在其中传递 SQL 表达式或关键字参数(或两者)。实际上,我发现这要方便得多,但人们总是对此感到困惑,因为他们通常仍无法理解column == expression
和之间的区别keyword = expression
。所以我们将它们分开了。
解决方案 3:
它是一种语法糖,可以加快查询编写速度。其伪代码实现如下:
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
并可用作缓存(与事务相关)
解决方案 4:
filter_by
使用关键字参数,而filter
允许使用 Python 风格的过滤参数,例如filter(User.name=="john")
解决方案 5:
除了之前发布的所有技术信息之外, filter()和filter_by()在可用性方面存在显著差异。
第二个函数filter_by()只能用于根据特定内容(字符串或某个数值)进行过滤。因此,它只能用于类别过滤,不能用于表达式过滤。
另一方面,filter()允许使用比较表达式(==、<、> 等),因此在需要“小于/大于”过滤时很有用。但也可以像filter_by()一样使用(当使用 == 时)。
只需记住这两个函数的参数类型语法不同。