Python-flask高级使用

一.Python-flask使用数据库

第一步:首先安装包

安装 flask-sqlalchemy (用于ORM):

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

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

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

安装 pymysql (MySQL驱动):

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

第二步:在__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 : 是否允许为空

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

在这里插入图片描述

二. 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))  # <class 'list'>
    # print(User.query, type(User.query))  # <class 'flask_sqlalchemy.query.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对象 <class 'App.models.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'

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)

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)

三. python-多表操作

3.1:一对一

在这里插入图片描述

3.2:一对多

在这里插入图片描述

第一步:建立模型(类)

在这里插入图片描述

建立关系方法一:

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

在这里插入图片描述

建立关系方法二:推荐

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

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

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

第二步:实操

单表操作:添加主表:

在这里插入图片描述

单表操作:添加子表:

在这里插入图片描述

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

在这里插入图片描述

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

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

多表操作:查询

在这里插入图片描述

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

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

通过主表查子表

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

3.3:多对多

在这里插入图片描述

第一步:建立模块

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

第二步:实操

增删改:同上

在这里插入图片描述

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码浪人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值