SQLAlchemy中filter_by()和filter()的用法不同

filter_by() 和 filter() 的最主要的区别:

模块 语法 ><(大于和小于)查询 and_和or_查询
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_by() 不支持><(大于和小于)和 and_、or_查询

 

SQLAlchemy中filter_by()和filter()的用法不同_第1张图片

user表

filter_by()
       查询 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() 就满足不了要求了

filter()
       查询 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()

以上的例子都是查询中使用比较多的,使用方面看大家喜好,filter_by() 对组合查询等等支持的不是很好,但是语法相对 filter() 简洁一些; 另外 filter() 还有很多其他的查询,大家可以自己去多多探讨。。。

笔记:

 

 

现在有 mysql 的 user 数据库表,存储内容如下图,下面通过例子来说明两种查询方式的用法:

在一个用户的模型类中, 要查询id为5的一个用户;

User.query.filter(User.id==5).all()  #  使用filter 中必须指定那个 模型类.id==5; 

User.query.filter(User.id==5).first()  # all() , first() ,都是查询执行器 , 一个返回列表包含对象, 一个直接返回对象;

User.query.filter_by(id=5).first()  # filter_by默认就是使用id  进行查询 , 写法为id=5; 不可以使用==; 也不用模型类.id的方式; 它是一种更加精确的查询;

 

 

# users = User.query.filter_by(isdelete=False).all()        用等值符号


# users = User.query.filter(User.isdelete == False,

                   User.phone.startswith('150')).order_by(-User.rdatetime)  用关系符号 升序降序正负号


users = User.query.filter(or_(User.username==search, User.phone == search)).all()  # select * from user where username=search or phone=search


number = User.query.filter(or_(User.username==search,User.phone == search)).count()


users = User.query.filter(or_(User.username.like('%' + search + '%'), User.phone == search)).all()  #返回的是列表


number = User.query.filter(or_(User.username.like(search), User.phone == search)).count()   
   

 

删除 跳过hrf 执行js脚本

你可能感兴趣的:(Flask)