Flask入门数据库过滤器与查询集(十一)

Flask入门数据库过滤器与查询集(十一)

1 查询集 : 指数据查询的集合
原始查询集: 不经过任何过滤返回的结果为原始查询集
数据查询集: 将原始查询集经过条件的筛选最终返回的结果
查询过滤器:

过滤器 功能
cls.query.filter(类名.属性名 条件操作符 条件) 过滤特定条件,返回的是query对象
cls.query.filter_by(关键字参数对) 单条件查询,条件必须关键字参数,而且and连接
cls.query.offset(num)/查询集对象.offset(num) 针对filter查询集对象偏移
cls.query.limit(num) 针对查询集取两条数据
cls.query.order_by(属性名).limit(num)
cls.query.order_by( -属性名).limit(num) 按属性名排序,取limit(num) 升序排列
按属性名排序,取limit(num) 降序排列
cls.query.groupby() 原查询分组,返回新查询
查询执行函数

查询执行方法 说明
cls.query.all() 所有的数据查询集,返回对象列表,不能链式调用
cls.query.first() 取第一个
cls.query.get(值) User.query.get(10) 取得id的值对应的数据
cls.query.filter().count() 返回查询结果数量
cls.query.filter().paginate() 返回paginate对象,此对象用于分页
cls.query.filter(类名.属性名.like(‘%值%’)) like模糊查询
cls.query.filter(类名.属性名.contains(‘值’)) contains包含某个值
cls.query.filter(User.username.startswith(‘张’)) startswith 以…开头/endswith以…结尾
cls.query.filter(User.id.in_([list])) in_ 和 not in 是否包含某个范围内
cls.query.filter(User.id.is_(None)) is_ isnot 查询为null/不为null 的数据
2 查询过滤器实例
(1) all() 得到所有的数据查询集 返回列表
类名.query.all() 不能够链式调用

@view.route(’/all/’)
def all():
data = User.query.all()
print(data)
return ‘删除数据’
1
2
3
4
5
(2) filter() 过滤默认查询所有
类名.query.filter()

类名.query.filter(类名.属性名 条件操作符 条件)

#filter 获取所有数据查询集
@view.route(’/filter/’)
def filter():
# data = User.query.filter()
# data = User.query.filter(User.username==‘王五’)
data = User.query.filter(User.username==‘王五’,User.sex==False)
print(data)
for i in data:
print(i.username,i.sex)
return ‘删除数据’
1
2
3
4
5
6
7
8
9
10
(3) filter_by() 单条件查询
@view.route(’/filter_by/’)
def filter_by():
# data = User.query.filter_by()
data = User.query.filter_by(age=18)
#只能为下面这种关键字的用法 且多个添加为and操作
# data = User.query.filter_by(username=‘王五’,sex=False)
1
2
3
4
5
6
(4) offset(num) 偏移量
@view.route(’/offset/’)
def offset():
# data = User.query.filter().offset(1)
# data = User.query.filter().offset(2)
#错误的用法
data = User.query.all().offset(2)
# print(User.query.filter())
# print(data)
# for i in data:
# print(i.username,i.sex)
return ‘删除数据’
1
2
3
4
5
6
7
8
9
10
11
(5) limit() 取值
@view.route(’/offsetlimit/’)
def offsetlimit():
data = User.query.offset(2).limit(2)
print(data)
for i in data:
print(i.username,i.sex)
return ‘limit’
1
2
3
4
5
6
7
(6) order_by() 排序
默认升序
-属性名
@view.route(’/orderby/’)
def orderby():
#升序
data = User.query.order_by(User.age).limit(1)
#降序
data = User.query.order_by(-User.age).limit(1)
1
2
3
4
5
6
3 查询执行函数
(1) first() 取出一条数据
@view.route(’/first/’)
def first():
# data = User.query.first() == User.query.get(1)
# data = User.query.order_by(-User.age).first()
data = User.query.order_by(User.age).first()
print(data.age)
print(data.username)
# for i in data:
# print(i.username,i.sex)
1
2
3
4
5
6
7
8
9
(2) get() 取得id值的数据
查询成功 返回 对象

查询失败 返回 None

data = User.query.get(10) #找到id=10的数据
print(data)
1
2
(3) contains 包含关系
类名.query.filter(类名.属性名.contains(‘值’))

data = User.query.filter(User.username.contains(‘五’))
1
(4) like 模糊查询
类名.query.filter(类名.属性名.like(‘%值%’))

data = User.query.filter(User.username.like(’%张%’)) #包含张
data = User.query.filter(User.username.like(’%张’)) #以张作为结尾
data = User.query.filter(User.username.like(‘张%’)) #以张作为开头
1
2
3
(5) startswith 以…开头 endswith以…结尾
data = User.query.filter(User.username.startswith(‘张’)) #以 张作为开头
data = User.query.filter(User.username.endswith(‘张’)) #以张作为结尾
1
2
(6) 比较运算符

  1. gt 大于

  2. ge 大于等于

  3. lt 小于

  4. le 小于等于

  5. <

  6. = <=

  7. != ==
    1
    2
    3
    4
    5
    6
    7
    data = User.query.filter(User.id>1) #查询id大于1的数据
    data = User.query.filter(User.id.gt(1)) #查询id大于1的数据
    data = User.query.filter(User.id.ge(1)) #查询id大于1的数据
    data = User.query.filter(User.id>=1) #查询id大于1的数据
    data = User.query.filter(User.id<3) #查询id大于1的数据
    data = User.query.filter(User.id.lt(3)) #查询id大于1的数据
    1
    2
    3
    4
    5
    6
    (7) in_ 和 not in 是否包含某个范围内
    #in的使用
    @view.route(’/in/’)
    def myin():
    data = User.query.filter(User.id.in_([1,2,3,4])) #在…范围内
    data = User.query.filter(~User.id.in_([1,2,3,4])) #not in不再…范围内
    data = User.query.filter(User.username.in_([‘张三’,‘王五’]))
    return render_template(‘show.html’,data=data)
    1
    2
    3
    4
    5
    6
    7
    (8) is_ / isnot 查询为null/不为null 的数据
    #对于null数据的处理
    @view.route(’/null/’)
    def null():
    #查询为null数据的
    data = User.query.filter(User.username.is_(None))
    data = User.query.filter(User.username == None)
    data = User.query.filter(~User.username.isnot(None))
    #查询不为null数据的
    data = User.query.filter(~User.username.is_(None))
    data = User.query.filter(User.username.isnot(None))
    data = User.query.filter(User.username != None)

    return render_template(‘show.html’,data=data)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    (9) count 统计
    @view.route(’/count/’)
    def mycount():
    #统计性别为sex的数据条数
    data = User.query.filter(not_(User.sex == True)).count()
    #统计所有数据的条数
    data = User.query.filter().count()
    data = User.query.count()
    return ‘{}条数据’.format(data)
    1
    2
    3
    4
    5
    6
    7
    8
    4 数据库逻辑查询
    from sqlalchemy import and_,or_,not_
    1
    (1) 逻辑与 and_
    #逻辑操作
    @view.route(’/and/’)
    def myand():
    data = User.query.filter(User.sexTrue,User.age<20)
    data = User.query.filter(User.sex
    True).filter(User.age<20)
    data = User.query.filter(and_(User.sexTrue,User.age<20))
    return render_template(‘show.html’,data=data)
    1
    2
    3
    4
    5
    6
    7
    (2) 逻辑或 or_
    #逻辑操作
    @view.route(’/or/’)
    def myor():
    #or
    data = User.query.filter(or_(User.sex
    True,User.age<20),User.id.in_([1,2,3]))
    #and 和 or的 一起使用
    data = User.query.filter(or_(User.sexTrue,User.age<20))
    return render_template(‘show.html’,data=data)
    1
    2
    3
    4
    5
    6
    7
    8
    (3) 逻辑非 not_
    #逻辑操作
    @view.route(’/not/’)
    def mynot():
    data = User.query.filter(not_(User.sex
    True))
    #错误写法只能有一个条件
    data = User.query.filter(not_(User.sexTrue,User.id!=1))
    data = User.query.filter(~User.sex
    True)
    return render_template(‘show.html’,data=data)
    1
    2
    3
    4
    5
    6
    7
    8
    5 flask-migrate 文件的迁移
    安装:

flask-script
flask-migrate
使用

from flask_migrate import Migrate,MigrateCommand
migrate = Migrate(app,db) #将app与db进行关联
manager = Manager(app)
manager.add_command(‘db’,MigrateCommand) #给manage添加迁移文件的命令db
1
2
3
4
(1) 生成迁移文件目录
python3 manage.py db init

生成 一个 migrations的迁移文件目录

(2) 生成迁移文件
python3 manage.py db migrate

(3) 执行迁移文件
python3 manage.py db upgrade

作者:why1673
来源:CSDN
原文:https://blog.csdn.net/weixin_41829272/article/details/80609968
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值