过滤条件参数化,就是公用方法中,不再指定具体的参数,类似python 中的 **kwargs传参方式,当然具体每个接口的过滤条件还是要在接口逻辑中控制的,只是不在公用方法中指定。
1. sqlalchemy 中的filter 和 filter_by 的区别
filter_by 接收的是k=v形式的参数,
eg:
session.query(MyClass).filter_by(key1="value1",key2="value2")
它只能接收这种形式的过滤条件,而且各过滤条件之间为 and 的关系,所以它只支持等值的,各条件间为 and关系的过滤,除了这种情况,就只能使用filter方法了,而且filter方法也能轻松实现 这种过滤。 -_-..
filter 接收的是布尔值表达式,
eg:
session.query(MyClass).filter(MyClass.name == 'some name', MyClass.id > 5)
它支持丰富的过滤形式,数值比较(==, >, <, !=, >=, <=), 逻辑比较(and, or, ...), in, between, like等,基本上mysql 支持的过滤方式都支持,具体的可以参考官方文档https://www.osgeo.cn/sqlalchemy/orm/queryguide.html。
2. 两种形式对应的参数化
filter_by 支持python中的解包,所以可以直接通过 **kwargs的方式进行过滤条件参数化。
filter, 可以接收一个所有过滤器组成的列表
eg:
filters = [UserModel.name.like("u%"), UserModel.age==18, UserModel.score>90]
session.query.filter(*filters)
基于这个功能,我们就能实现过滤条件的参数化,比如将某些模型类的分页数据抽象一个公用方法,接收一组过滤条件进行查询,再进行排序,分页等,具体的过滤条件放在上一层进行拼接。
浙公网安备 33010602011771号