前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQLAlchemy学习-8.query查找之filter()和filter_by()区别

SQLAlchemy学习-8.query查找之filter()和filter_by()区别

作者头像
上海-悠悠
发布2022-07-19 12:47:45
2.6K0
发布2022-07-19 12:47:45
举报

前言

SQLAlchemy 使用query查询的时,可以使用filter()和filter_by() 过滤条件。 filter_by() 参数直接用属性名,比较用一个= filter() 参数 用类名.属性名,比较用 ==

filter_by() 语法

filter_by() 源码如下

    def filter_by(self, **kwargs):
        r"""Apply the given filtering criterion to a copy
        of this :class:`_query.Query`, using keyword expressions.

        e.g.::

            session.query(MyClass).filter_by(name = 'some name')

        Multiple criteria may be specified as comma separated; the effect
        is that they will be joined together using the :func:`.and_`
        function::

            session.query(MyClass).\
                filter_by(name = 'some name', id = 5)

        The keyword expressions are extracted from the primary
        entity of the query, or the last entity that was the
        target of a call to :meth:`_query.Query.join`.

        .. seealso::

            :meth:`_query.Query.filter` - filter on SQL expressions.

        """
        from_entity = self._filter_by_zero()
        if from_entity is None:
            raise sa_exc.InvalidRequestError(
                "Can't use filter_by when the first entity '%s' of a query "
                "is not a mapped class. Please use the filter method instead, "
                "or change the order of the entities in the query"
                % self._query_entity_zero()
            )

        clauses = [
            _entity_namespace_key(from_entity, key) == value
            for key, value in kwargs.items()
        ]
        return self.filter(*clauses)

从源码可以看出,filter_by() 封装了 filter() 方法,参数接受键值对的关键字参数**kwargs

主要区别

模块

参数

大于(>)和小于(<)

and、or、like、in_

filter_by()

直接用属性名,比较用=

不支持

不支持

filter()

用类名.属性名,比较用==

支持

支持

filter_by() 使用示例

filterby() 只能筛选条件等于,不支持 大于 (>)和小于 (<)和 and、or_查询

session.query(Students).filter_by(name='yoyo').all()

如果需要满足多个条件,查询name名称等于’yoyo’, 并且年龄age等于20,中间用逗号隔开

session.query(Students).filter_by(name='yoyo', age=20).all()

等价于filter查询

db.session.query(Students).filter(Students.name == 'yoyo').all()
db.session.query(Students).filter(Students.name == 'yoyo', Students.age == 20).all()

filter() 示例

filter() 除了可以支持判断等于,还可以支持 大于 (>)和小于 (<)和 and、or、like、in_查询

# 大于 >
session.query(Students).filter(Students.age > 20).all()

# 小于 <

session.query(Students).filter(Students.age < 20).all()

# and_ 查询
session.query(Students).filter(and_(Students.name == 'yoyo', Students.age == 20)).all()

# or_查询
session.query(Students).filter(or_(Students.id >= 1, Students.name == 'yoyo')).all()

# like 模糊匹配
session.query(Students.name).filter(Students.name.like('%yoyo%')).all()

# _in包含

session.query(Students.name).filter(Students.name.in_(['yoyo', 'yoyo1'])).all()

filter更多查询参考https://www.cnblogs.com/yoyoketang/p/16477058.html

2022年第 11 期《python接口web自动化+测试开发》课程,6月5号开学

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • filter_by() 语法
  • filter_by() 使用示例
  • filter() 示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档