filter_by() 和 filter() 的最主要的区别:
谈 filter_by() 的语法之前先看下 filter_by() 的内部源码,去掉注释之后如下:
def filter_by(self, **kwargs):
clauses = [_entity_descriptor(self._joinpoint_zero(), key) == value
for key, value in kwargs.items()]
return self.filter(sql.and_(*clauses))
我们可以看到filter_by()就是filter()简化版,仅支持少部分功能。
1.filter_by的用法
filter_by用于查询简单的列名,不支持比较运算符。
语法: column = expression
传入参数的写法,只需要用:(不带类名的)列名 单个等号 就可以判断。
举例:
query(User.name).filter_by(fullname='Ed Jones')
filters = {'name':'fengyao','age': 26}
User.query.filter_by(**filters).first()
#查询 user 表里面名字等于 Tom 的:
db.session.query(User).filter_by(name='Tom').all()
#查询 user 表里面名字等于 Tom 并且年龄等于 18:
db.session.query(User).filter_by(name='Tom', age=18).all()
比如新的需求,查询 user 表里面名字等于 Tom 或者年龄等于 18 的用户,那么 filter_by() 就满足不了要求了
2.filter的用法
filter中,语法更加贴近于,类似于,Python的语法。
比filter_by的功能更强大,且更复杂的查询的语法,比如and(),or()等多个条件的查询,只支持filter
语法: column == expression
传入参数的写法,要用:类名.列名 两个等号 去判断
举例:
query(User.name).filter(User.fullname=='Ed Jones')
query.filter(or_(User.name =='ed', User.name =='wendy'))
query.filter(and_(User.name =='ed', User.fullname =='Ed Jones'))
filters = {
User.name =='fengyao',
User.age > 25
}
User.query.filter(*filters).first()
#查询 user 表里面名字等于 Tom 的:
db.session.query(User).filter(User.name =='Tom').all()
#查询 user 表里面名字等于 Tom 并且年龄等于 18:
db.session.query(User).filter(User.name =='Tom', User.age == 18).all()
#也可以这样:
db.session.query(User).filter(User.name =='Tom').filter(User.age == 18).all()
#如果想使用 and 拼接需要用以下方式:
db.session.query(User).filter(and_(User.name =='Tom', User.age == 18)).all()
#以下的方式 and 后面的 User.age == 18 不会生效:
db.session.query(User).filter(User.name =='Tom' and User.age == 18).all()
#查询 user 表里面名字等于 Tom 的或者年龄等于 18:
db.session.query(User).filter(or_(User.name =='Tom', User.age == 18)).all()
#查询 user 表里面名字等于 Tom 的并且年龄大于 18
db.session.query(User).filter(User.name =='Tom', User.age > 18).all()
#查询 name 中包含字母 a 的所有数据(模糊查询)
db.session.query(User).filter(User.name.like('%{0}%'.format("a"))).all()
参考资料
https://www.jianshu.com/p/ca9bc9f8adab
https://segmentfault.com/q/1010000000140472
转载请注明:IPCPU-网络之路 » SQLALchemy中的过滤方法filter_by()和filter()用法和区别