Python轻量级Web框架Flask(7)——翻页功能/多表操作

news2024/11/19 1:35:22

1、使用paginate实现分页:

  • 基础指令(新建对象)
    在这里插入图片描述
  • 基础指令(使用对象属性)
    在这里插入图片描述
    在这里插入图片描述

2、几种类型的表操作:

  • 一对一:例如一个人只能有一张身份证。
  • 一对多:例如班级和学生(一个班级可以对应多个学生,而每个学生只能有一个班级,对于学生而言这就是一对一的关系)
  • 多对多:例如一个学生可以选择多门选修课,一门选修课对应多个学生(多对多关系需要有一个中间表,多对多关系可以分解为两个一对多关系)

3、一对多操作:

  • 现在通过一对多的关系(一个班级可以有多个学生)在数据库建表,进行说明:
  • 项目模板借鉴:Python轻量级Web框架Flask(6)中的项目模板

3.1、代码展示:

__init __代码:

# __init__.py : 初始化文件,创建Flask应用
from flask import Flask
from .views import blue
from .exts import init_exts

def creat_app():
    app = Flask(__name__)

    # 注册蓝图
    app.register_blueprint(blueprint=blue)

    # 配置数据库
    # db_uri = 'sqlite:///sqlite3.db'
    db_uri = 'mysql+pymysql://root:123456@localhost:3306/flaskdb2' # mysql的配置,要记得在mySQL中配置flaskdb2数据库
    app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 禁止对象追踪修改

    # 初始化插件
    init_exts(app=app)

    return app

exts代码:

from flask_sqlalchemy import SQLAlchemy # ORM
from flask_migrate import Migrate   # 数据迁移

db = SQLAlchemy()
migrate = Migrate()

def init_exts(app):
    db.init_app(app=app)
    migrate.init_app(app=app,db=db)

models 代码

# models.py : 模型,数据库
from .exts import db

# 建立一对多的多表关系:班级和学生(1:N)
# 班级表:
class Grade(db.Model):
    __tablename__ = 'grade'   # 表名
    # 定义表字段
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True, index=True)
    # 建立关联:
    #   第一个参数:关联的模型名(表名)
    #   第二个参数:反向引用的名称,grade对象
    #             让student反过来得到grade对象的名称:student.grade
    #   第三个参数:懒加载(不用的时候不调用,用到之后才调用)
    # 注意:这里的students不是字段,是类属性
    students = db.relationship('Student', backref='grade', lazy=True)  # 这里Student因为在之后定义,所以可以先用字符串来替代
# 学生表:
class Student(db.Model):
    __tablename__ = 'student'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True)
    age = db.Column(db.Integer)
    # 外键:跟Grade表中的id字段关联
    gradeid = db.Column(db.Integer, db.ForeignKey(Grade.id))

完成了上面的步骤之后,下一步就是经典的数据迁移步骤:
1、在pycharm终端中把整个项目文件拖进去,然后在终端执行:flask db init
2、在终端继续执行:flask db migrate
3、在终端继续执行:flask db upgrade
上述步骤执行结束之后,models中的表就已经生成了,但是其中还没有添加数据,此阶段项目概览如下。

3.2、项目概览:

在这里插入图片描述

3.3、多表操作:

多表操作主要是在views.py文件中操作

# 在views.py中放路由和视图函数
import random

from flask import Blueprint, request, render_template
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件

# 蓝图
blue = Blueprint('user', __name__)

@blue.route('/')
def index():
    return 'index'

# 一对多添加数据:先给唯一项添加数据,然后再给多项添加数据,因为外键绑定在多项上
@blue.route('/add_grade/')
def add_grade():
    # 添加班级
    grades = []
    for i in range(5):
        grade = Grade()
        grade.name = f'HuaQing{i}班'
        grades.append(grade)
    try:
        db.session.add_all(grades)
        db.session.commit()
    except Exception as e:
        print(f'e:{e}')
        db.session.rollback()
        db.session.flush()
    return 'add_Ok!'
@blue.route('/add_stu/')
def add_stu():
    l = ['张', '刘', '王', '赵']
    # 添加学生
    stus = []
    for i in range(11):
        stu = Student()
        stu.name = str(l[random.randint(0, 3)]) + str(i)
        stu.age = random.randint(18,21)
        stu.gradeid = random.randint(1,2)
        stus.append(stu)
    print(stus)
    try:
        db.session.add_all(stus)
        db.session.commit()
    except Exception as e:
        print(f'e:{e}')
        db.session.rollback()
        db.session.flush()
    return 'add_Ok!'

# 修改:注意修改之前要先查找数据
@blue.route('/updatestu/')
def upset_stu():
    stu = Student.query.first()
    stu.name = '改名六六六'
    try:
        db.session.commit()
    except Exception as e:
        print('e:', e)
        db.session.rollback()
        db.session.flush()
    return 'XiuGaiOk!'

# 删除:注意删除之前要先查找数据
@blue.route('/del_stu/')
def delete_stu():
    stu = Student.query.first()
    db.session.delete(stu)
    try:
        db.session.commit()
    except Exception as e:
        print('e:', e)
        db.session.rollback()
        db.session.flush()
    return 'ShanChuOk!'

# 查询:因为在models中有设置,所以这里可以反向引用
@blue.route('/get/')
def get():
    # 查询id为40的学生所在的班级
    stu = Student.query.get(40)
    print(stu.name, stu.age)
    print(stu.gradeid, stu.grade, stu.grade.name,
          stu.grade.id)
    # 查询gradeid是2的所有学生
    grade = Grade.query.get(2)
    print(grade.name,
          grade.students)   # 这里的students在models中的Grade中最后定义的
    return 'getstuOK!'


4、多对多操作:

  • 多对多继续用上面一对多的项目框架

  • 设计多对多数据表:设计一个用户和电影之间多对多的表,中间表设计为收藏表(一个用户可以收藏多个电影,一个电影也可以被多个用户收藏),表格关系如下:
    在这里插入图片描述

  • 什么是正向引用,什么是反向引用:A表和B表关联,A调用B,对于A来说是正向引用,对于B来说是反向引用。

  • 多对多中表格的建立可以通过下述的标准代码方法进行,也可以设置两个一对多来实现。

4.1、举例实现多对多操作:

1、 models中的代码:

# models.py : 模型,数据库
from .exts import db
# ---------------------------------多对多---------------------------------
# 中间表(收藏表):注意在多对多关系中中间表要写在其他表的最前面,而且表格写法也和普通表不一样。
# 中间表中可以不用单独设置主键,这样就可以把关联的两个表的主键作为主键,在数据库中如果有两个主键,则这两个主键的组合代表了一行数据。
collect = db.Table( # db中的还有一个Table的类,用它可以创建一个Table对象
    'collects',# 表名
    # 注意,下面代码中'usermodel.id'中usermodel是UserModel的小写表示,由于类的特性(没法调用写在后面的类),在模型中可以先用字符串表示。
    db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
    db.Column('movie_id', db.Integer, db.ForeignKey('movie.id'), primary_key=True),
)
# 普通表(用户表):
class User(db.Model):
    __tablename__ = 'users' # 表名
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30))
    age = db.Column(db.Integer)
# 普通表(电影表):
class Movie(db.Model):
    __tablename__ = 'movies' # 表名
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30))
    # 关联:这个关联可以建立在电影表中,也可以建立在用户表中,但是参数就有所不同了。
    # secondary=collect:设置中间表
    movie_users = db.relationship('UserModel', backref='user_movies', lazy=True, Secondary=collect)
    '''
    lazy属性:
        懒加载,可以延迟在使用关联属性的时候才建立关联
        lazy='dynamic':会返回一个query对象(查询集),可以继续使用其他查询方法,如all()
        lazy='select':首次访问到属性的时候,就会全部加载该属性的数据
        lazy='joined':在对关联的两个表进行join操作,从而获取所有相关的对象
        lazy='True':返回一个可用的列表对象,同select
    '''

2、数据迁移:因为在一对多中已经数据迁移过了,所以就不用初始化了

在终端中该项目路径下执行:flask db migrate	此时会在migrations中的versions中出现一个新编号的py文件
在终端中该项目路径下执行:flask db upgrade 此时会在数据库中生成这三个表

3、多对多表格操作:这部分主要在views文件中完成

# 在views.py中放路由和视图函数
import random

from flask import Blueprint, request, render_template
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件

# 蓝图
blue = Blueprint('user', __name__)

@blue.route('/')
def index():
    return 'index'
# ---------------------------------多对多---------------------------------
# 添加数据
@blue.route('/add_user/')
def add_users():
    l = ['张', '刘', '王', '赵']
    # 添加用户
    users = []
    for i in range(1, 6):
        user = User()
        user.name = str(l[random.randint(0, 3)]) + str(i)
        user.age = random.randint(8,100)
        users.append(user)
    try:
        db.session.add_all(users)
        db.session.commit()
    except Exception as e:
        print(f'e:{e}')
        db.session.rollback()
        db.session.flush()
    return 'add_Ok!'
@blue.route('/add_movie/')
def add_movies():
    l = ['流浪地球', '阿凡达', '蜡笔', '拉丁哇']
    # 添加电影
    movies = []
    for i in range(1, 6):
        movie = Movie()
        movie.name = str(l[random.randint(0, 3)]) + str(i)
        movies.append(movie)
    try:
        db.session.add_all(movies)
        db.session.commit()
    except Exception as e:
        print(f'e:{e}')
        db.session.rollback()
        db.session.flush()
    return 'add_Ok!'
@blue.route('/add_collect/')
def add_collects():
    # 用户收藏电影
    user = User.query.get(1)
    movie = Movie.query.get(1)

    user.user_movies.append(movie)
    db.session.commit()
    return 'add_Ok!'

# 查询
@blue.route('/get_collect/')
def get_collect():
    # 查找某个用户收藏的所有电影
    user = User.query.get(1)
    print(user.user_movies)
    print(Movie.query.get(5).movie_users)
    return 'query_OK!'

# 修改操作和单表操作一样

# 删除:
@blue.route('/del_user/')
def del_users():
    user = User.query.get(1)
    # 删除了user中的id=1,则在collect表中和1相关的数据也都会被删除
    # 删除操作只会影响关联表,不会影响其他表
    db.session.delete(user)
    db.session.commit()
    return 'OK!'

总结:

  • 1、不论是单表操作还是多表操作流程都一样:
    • 首先在models中建表。(在一对多的情况下,外键是写在多的表格中)
    • 然后在终端进行“数据迁移”(就是把flask模型中建的表放到电脑的数据库中),这一步就要看你__init __中db_uri连接的是什么数据库了。
    • 数据迁移要注意有过初始化的就不用重复初始化。
    • 数据表的:增、删、改、查都是在views中进行的,要注意的一点是一对多和多对多中数据增加是有区别的,多对多中,对中间表进行添加数据时和普通表添加数据有区别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苦中作乐 ---竞赛刷题 完结篇(25分)

(一)目录 L2-014 列车调度 L2-024 部落 L2-033 简单计算器 L2-042 老板的作息表 L2-041 插松枝 (二)题目 L2-014 列车调度 火车站的列车调度铁轨的结构如下图所示。 两端分别是一条入口(Entrance)轨道…

Java分布式事务(十二)

文章目录 🔥Hmily实现TCC分布式事务_项目搭建🔥Hmily实现TCC分布式事务实战_公共模块🔥Hmily实现TCC分布式事务_集成Dubbo框架🔥Hmily实现TCC分布式事务_项目搭建 创建父工程tx-tcc 设置逻辑工程 <packaging>pom</packaging>创建公共模块 创建转出银行…

分析 | 通过 NFTScan 率先捕获 NFT 投资趋势

NFT 市场信息高度动态且机会稍纵即逝&#xff0c;了解市场第一信息对于 NFT 的参与者来说都是至关重要的。所以市场主体参与者必须密切关注各种渠道&#xff0c;努力获取最新一手 NFT 信息&#xff0c;这对参与者抓住先机和获益至关关键&#xff0c;若信息滞后&#xff0c;容易…

【流畅的Python学习笔记】2023.4.21

此栏目记录我学习《流畅的Python》一书的学习笔记&#xff0c;这是一个自用笔记&#xff0c;所以写的比较随意 特殊方法&#xff08;魔术方法&#xff09; 不管在哪种框架下写程序&#xff0c;都会花费大量时间去实现那些会被框架本身调用的方法&#xff0c;Python 也不例外。…

【Python】matplotlib设置图片边缘距离和plt.lengend图例放在图像的外侧

一、问题提出 我有这样一串代码&#xff1a; import matplotlib.pyplot as plt plt.figure(figsize (10, 6)) " 此处省略代码 " legend.append("J") plt.legend(legend) plt.xlabel(recall) plt.ylabel(precision) plt.grid() plt.show()我们得到的图像…

KMP算法原理原来这么简单

我觉得这句话说的很好&#xff1a; kmp算法关键在于&#xff1a;在当前对文本串和模式串检索的过程中&#xff0c;若出现了不匹配&#xff0c;如何充分利用已经匹配的部分&#xff0c;来继续接下来的检索。 暴力解决字符串匹配 暴力解法就是两层for循环,每次都一对一的匹配&…

面试官:“请描述一下Android系统的启动流程”

作者&#xff1a;OpenGL 前言 什么是Android启动流程呢&#xff1f;其实指的就是我们Android系统从按下电源到显示界面的整个过程。 当我们把手机充好电&#xff0c;按下电源&#xff0c;手机会弹出相应启动界面&#xff0c;在等了一段时间之后&#xff0c;会弹出我们熟悉的主…

AI数据标注工程师这个职业怎么样?

本篇文章主要讲解ai数据标注工程师这个职业的具体情况和相关的职业前景 作者&#xff1a;任聪聪 日期&#xff1a;2023年4月18日 数据是ai的灵魂&#xff0c;自然界中相对应的数据都活多少存在不准确、杂乱、无效等属性&#xff0c;需要人为进行收集、整理、分类和处理。其中ai…

Linux 内核原理摘录

文章目录 一、Linux 内核设计与实现1、进程管理&#xff08;1&#xff09;调度2、内核数据结构&#xff08;1&#xff09;kfifo 3、中断 一、Linux 内核设计与实现 本章主要用来摘录《Linux 内核设计与实现》一书中学习知识点&#xff0c;其基于 Linux 2.6.34 。 1、进程管理 …

PowerShell install go+caddy+filebrowser+nssm 实现部署文件系统

filebrowser filebrowser 是一个使用go语言编写的软件&#xff0c;功能是可以通过浏览器对服务器上的文件进行管理。可以是修改文件&#xff0c;或者是添加删除文件&#xff0c;甚至可以分享文件&#xff0c;是一个很棒的文件管理器&#xff0c;你甚至可以当成一个网盘来使用。…

找高清视频素材,就上这6个网站。

推荐6个高清视频素材库&#xff0c;免费下载&#xff0c;建议收藏~ 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库可以找到设计、办公、图片、视频、音频等各种素材。视频素材就有上千个&#xff0c;全部都很高清&#xff0c;站内可以按标签分类查找…

某医院访问医保系统慢流量分析案例

背景 我们已将NetInside流量分析系统部署到某市人民医院的机房内&#xff0c;使用流量分析系统提供实时和历史原始流量。本次分析重点针对访问外网医保系统性能进行分析&#xff0c;以供安全取证、性能分析、网络质量监测以及深层网络分析。 分析时间 报告分析时间范围为&am…

【Linux】进程间通讯

前提知识 进程间具有独立性 &#xff0c;现在我们要打破独立性&#xff0c;去通讯&#xff0c;所以 通讯的成本一定很高。 又时候又需要多进程协同完成某种业务内容 &#xff0c;例如以前&#xff1a; cat file | grep “hello",这就是两个进程之间的通讯。 通讯的本质就是…

【一文学会MQTT协议和mosquitto】

一文学会MQTT协议和mosquitto 一.、MQTT的基本概念二、mosquittomosquitto基本概念常用API 三、MQTT测试EMQX 一.、MQTT的基本概念 MQTT是一种基于发布/订阅模式的协议&#xff0c;其中发布者发布消息&#xff0c;订阅者订阅感兴趣的主题&#xff08;topic&#xff09;&#x…

QGIS--开发OpenSCENARIO动态场景(二)--安装插件

1.下载并安装ad_map&#xff08;无需构建&#xff09;&#xff1a; 1&#xff09;ad_map插件&#xff1a; https://github.com/carla-simulator/map/releases 下载第一个&#xff1a;ad_map_access_qgis.zip 2&#xff09;导入插件&#xff1a; 从MenuBar的Plugins >…

YOLOv8 更换主干网络之 FasterNet

论文地址:https://export.arxiv.org/pdf/2303.03667v1.pdf 为了设计快速神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,作者观察到FLOPs的这种减少不一定会带来延迟的类似程度的减少。这主要源于每秒低浮点运算(FLOPS)效率低下。并且,如此低的FLOPS主要…

ThreadLocal InheritableThreadLocal TransmittableThreadLocal的使用以及原理

ThreadLocal 每个线程向ThreadLocal设置值&#xff0c;再取值&#xff0c;实现线程之间的隔离 public class ThreadLocalCase1 {private static ThreadLocal<Integer> threadLocal new ThreadLocal<>();public static void main(String[] args) {Random random …

Postman接口与压力测试实例

Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。它提供功能强大的 Web API & HTTP 请求调试。 1、环境变量和全局变量设置 环境变量可以使用在以下地方&#xff1a; URLURL paramsHeader valuesform-data/url-encoded valuesRaw body contentHelper f…

MySQL学习笔记第一天

第02章 MySQL环境搭建 1.MySQL的卸载 步骤1&#xff1a;停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键&#xff0c;打开“任务管理器”对话框&#xff0c;可以在“服务”列表找到“MySQL8.0”的服务&#xff0c;如果现…

AIGC: Midjourney和Stable Diffusion在大厂中的应用

AIGC: Midjourney和Stable Diffusion在大厂中的应用和教程​http://www.webhub123.com/#/home/detail?projectHashid51631966&ownerUserid21336964 收录效果如下 登录后即可一键拥挤收藏以下所有文章网址到我的收藏夹&#xff0c;网站帮你简单高效地管理你的网络收藏&…