filter_by() 和 filter() 的最主要的区别:
image.png谈 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))
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()
网友评论