• Python-flask高级使用


    一.Python-flask使用数据库

    第一步:首先安装包

    安装 flask-sqlalchemy (用于ORM):

    pip install flask-sqlalchemy -i https://pypi.douban.com/simple
    
    • 1

    安装 flask-migrate (用于数据迁移):

    pip install flask-migrate -i https://pypi.douban.com/simple
    
    • 1

    安装 pymysql (MySQL驱动):

    pip install pymysql -i https://pypi.douban.com/simple
    
    • 1

    第二步:在__init__ 配置

    在这里插入图片描述

    第三步:插件管理

    第一步:新建一个py:用于管理插件

    在这里插入图片描述

    第二步:初始化插件

    在这里插入图片描述
    在这里插入图片描述

    第四步:在models新建model的类

    在这里插入图片描述

    # models.py : 模型,数据库
     
    from .exts import db
     
    #  模型          数据库
    #     类   ==> 表结构
    #  类属性   ==>  表字段
    # 一个对象  ==>  表的一行数据
     
    # 模型Model:类
    #  必须继承 db.Model
    class User(db.Model):
        # 表名
        __tablename__ = 'tb_user'
        # 定义表字段
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        name = db.Column(db.String(30), unique=True, index=True)
        age = db.Column(db.Integer, default=1)
        sex = db.Column(db.Boolean, default=True)
        salary = db.Column(db.Float, default=100000, nullable=False)
        salary2 = db.Column(db.Float, default=100000, nullable=False)
     
     
    # db.Column : 表示字段
    # db.Integer:表示整数
    # primary_key=True : 主键
    # autoincrement=True : 自动递增
    # db.String(30): varchar(30) 可变字符串
    # unique=True : 唯一约束
    # index=True : 普通索引
    # default=1 : 默认值
    # nullable=False : 是否允许为空
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    第五步:数据迁移(表变化,数据库里的表也需要自动变化)

    在这里插入图片描述

    二. python-单表操作

    在这里插入图片描述

    2.1添加

    2.1.1 添加单个信息

    在这里插入图片描述

    2.1.2 添加多条信息

    在这里插入图片描述

    2.1.3事务

    在这里插入图片描述

    2.2 删除

    2.2.1 删除第一条数据

    在这里插入图片描述

    2.3 修改

    2.3.1 修改第一条数据

    在这里插入图片描述

    2.4 查找

    2.4.1 查找

    在这里插入图片描述

     
    # 查:查询数据
    #   条件
    @blue.route('/userget/')
    def user_get():
        # all(): 返回所有数据,返回列表
        users = User.query.all()
        # print(users, type(users))  # 
        # print(User.query, type(User.query))  # 
     
        # filter() : 过滤,得到查询集,类似SQL中的where
        users = User.query.filter()
        # print(users, type(users))  # 查询集
        # print(list(users))
     
        # get():查询到对应主键的数据对象
        user = User.query.get(8)
        # print(user, type(user))  # User对象 
        # print(user.name, user.age)  # 获取数据的属性
     
        # filter() : 类似SQL中的where
        # filter_by() : 用于等值操作的过滤
        # users = User.query.filter(User.age==20)
        # users = User.query.filter_by(age=20)
        users = User.query.filter(User.age>20)  # 可以用于非等值操作
        # print(list(users))  # [冰冰20]
     
        # first() : 第一条数据
        # first_or_404(): 第一条数据,如果不存在则抛出404错误
        user = User.query.first()
        # user = User.query.filter_by(age=100).first_or_404()
        # print(user)
     
        # count(): 统计查询集中的数据条数
        users = User.query.filter()
        # print(users.count())  # 20
     
        # limit() : 前几条
        # offset() : 跳过前几条
        users = User.query.offset(3).limit(4)
        # print(list(users))
     
        # order_by() : 排序
        users = User.query.order_by('age')  # 升序
        users = User.query.order_by(desc('age'))  # 降序
        # print(list(users))
     
        # 逻辑运算:and_,or_,not_
        users = User.query.filter(User.age>20, User.age<25)  # 且,常用
        users = User.query.filter(and_(User.age>20, User.age<25))  # 且
        users = User.query.filter(or_(User.age>25, User.age<20))  # 或
        users = User.query.filter(not_(or_(User.age>25, User.age<20)))  # 非
        # print(list(users))
     
        # 查询属性
        # contains('3'): 模糊查找,类似SQL中的like
        users = User.query.filter(User.name.contains('3'))
        # in_(): 其中之一
        users = User.query.filter(User.age.in_([10, 20, 30, 40, 50]))
        # startswith() : 以某子串开头
        # endswith() : 以某子串结尾
        users = User.query.filter(User.name.startswith('冰'))  #
        users = User.query.filter(User.name.endswith('2'))
        # print(list(users))
     
        # __gt__: 大于
        users = User.query.filter(User.age.__gt__(25))
        print(list(users))
     
        return 'success'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70

    2.5 分页

    2.5.1 手动翻页

    
    # 分页,翻页
    #  1.手动翻页
    #     offset().limit()
    #  数据: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
    #  页码:page=1
    #  每页显示数量:per_page=5
    #   page=1 :  1,2,3,4,5       =>  offset(0).limit(5)
    #   page=2 :  6,7,8,9,10      =>  offset(5).limit(5)
    #   page=3 :  11,12,13,14,15  =>  offset(10).limit(5)
    #   page=4 :  16,17,18,19,20  =>  offset(15).limit(5)
    #   ...                            ....
    #   page=n :          =>  offset((page-1)*per_page).limit(per_page)
      users = User.query.offset((page-1)*per_page).limit(per_page)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.5.2 自动翻页

    
    
    # 2.paginate对象
    @blue.route('/paginate/')
    def get_paginate():
        # 页码:默认显示第一页
        page = int(request.args.get('page', 1))
        # per_page: 每页显示数据量
        per_page = int(request.args.get('per_page', 5))
        # print(page, type(page))
        # print(per_page, type(per_page))
     
        # paginate()
        p = User.query.paginate(page=page, per_page=per_page, error_out=False)
        # paginate对象的属性:
        # items:返回当前页的内容列表
        print(p.items)
        # has_next:是否还有下一页
        # print(p.has_next)
        # has_prev:是否还有上一页
        # print(p.has_prev)
        # next(error_out=False):返回下一页的Pagination对象
        # print(p.next(error_out=False).items)
        # prev(error_out=False):返回上一页的Pagination对象
        # print(p.prev(error_out=False).items)
     
        # page:当前页的页码(从1开始)
        print(p.page)
        # pages:总页数
        print(p.pages)
        # per_page:每页显示的数量
        # print(p.per_page)
        # prev_num:上一页页码数
        # print(p.prev_num)
        # next_num:下一页页码数
        # print(p.next_num)
        # total:查询返回的记录总数
        print(p.total)
     
        return render_template('paginate.html', p=p)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    三. python-多表操作

    3.1:一对一

    在这里插入图片描述

    3.2:一对多

    在这里插入图片描述

    第一步:建立模型(类)

    在这里插入图片描述

    建立关系方法一:

    给子表添加relationship来应用外键指向那个orm(相对主表)模型
    主表-子表都要添加
    back_populates:告诉另个表,你在用我的时候,可以定义一个名字为back_populates='xxx’的,但是你要有这个属性

    在这里插入图片描述

    建立关系方法二:推荐

    只在子表添加:backref=‘’’
    子表:主动给主表绑定一个自身为单位的属性
    在这里插入图片描述
    返过来也可以:

    子表:
    在这里插入图片描述

    主表:使用单引号
    懒加载:用的时候才进行关联加载
    在这里插入图片描述

    第二步:实操

    单表操作:添加主表:

    在这里插入图片描述

    单表操作:添加子表:

    在这里插入图片描述

    单表操作:修改、删除主表:

    在这里插入图片描述

    在这里插入图片描述
    删除班级:因为是主表,所以会取消关联关系

    在这里插入图片描述
    在这里插入图片描述

    多表操作:查询

    在这里插入图片描述

    在这里插入图片描述
    正向查询:通过主表查子表

    反向查询:通过子表查主表

    通过主表查子表

    在这里插入图片描述
    在这里插入图片描述

    3.3:多对多

    在这里插入图片描述

    第一步:建立模块

    中间表有点特殊
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    第二步:实操

    增删改:同上

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    jQuery 效果- 隐藏和显示
    常用设计模式之.Net示例代码合集
    【计算机毕业设计】会议发布与预约系统小程序
    【数据结构】栈的知识点总结--关于栈的定义和基本操作;C语言实现栈;顺序栈;链栈;共享栈;栈的易错点的总结
    基于KPCA 和 STFT 非侵入式负荷监控(Matlab代码实现)
    【docker容器技术与K8s】
    【JAVA】Web服务器—Tomcat
    Spring简短回顾
    Dokcer常用命令
    【LeetCode】掉落的方块 [H](线段树)
  • 原文地址:https://blog.csdn.net/huiguo_/article/details/133884864