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


    前言

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

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

    主要区别

    模块参数大于(>)和小于(<)and_、or_、like、in_
    filter_by()直接用属性名,比较用=不支持不支持
    filter()用类名.属性名,比较用==支持支持

    filter_by() 使用示例

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

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

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

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

    等价于filter查询

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

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

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

  • 相关阅读:
    安利!如何提优质的ISSUE?学霸是这样写的!
    低价寄快递寄件微信小程序 实际商用版 寄快递 低价寄快递小程序(源代码+截图)前后台源码
    2022.11.17补题祭
    和lc聊天记录整理
    Springboot整合Flowable6.x导出bpmn20
    SSL证书报错类型及解决方法
    计算机网络原理 网络层
    cnn 实现图片识别
    vscode与vue/react环境配置
    AF_UNIX和127.0.0.1(AF_INET)回环地址写数据速度对比
  • 原文地址:https://blog.csdn.net/qq_27371025/article/details/126440700