美文网首页
Flask-SQLALchemy动态的filter_by和fil

Flask-SQLALchemy动态的filter_by和fil

作者: 空口言_1d2e | 来源:发表于2019-06-17 08:43 被阅读0次

    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()
    

    相关文章

      网友评论

          本文标题:Flask-SQLALchemy动态的filter_by和fil

          本文链接:https://www.haomeiwen.com/subject/rnrnfctx.html