最新消息:

SQLALchemy中的过滤方法filter_by()和filter()用法和区别

Linux ipcpu 1浏览 0评论

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()用法和区别

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址