filter()和filter_by() 的使用

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

主要区别

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

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

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

 

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

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

 

等价于filter查询

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

 

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

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

# 小于 <

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

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

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

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

# _in包含

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

 

多个条件查询

多个条件查询,并且条件的个数不确定,用filter_by() 只能判断相等和不相等,无法模糊匹配.
如果用filter_by()可以把查询的条件写的一个字典,为None的数据先从字典剔除,如下示例

query_dict = {
    "name": "zhangsan",
    "age": 22
}
# 剔除query_dict参数为空的数据后
Students.query.filter_by(**query_dict)

 

使用filter() 查询功能更灵活,所以大部分会使用filter() 结合 _or

students_filter = Students.query.filter(
        or_(Students.name == name, name == None),
        or_(Students.tel == tel, tel == None),
        or_(Students.email == email, email == None),
    ).all()

 

posted @ 2023-05-17 17:57  寒风孤影,江湖故人  阅读(281)  评论(0编辑  收藏  举报