首页 > 其他分享 >15、flask-模型-models-表的操作-多表操作-一对多

15、flask-模型-models-表的操作-多表操作-一对多

时间:2024-07-27 20:56:30浏览次数:15  
标签:__ 多表 stu flask app db grade models session

这里选择学生表和班级表作为案例

app.py

from App import create_app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)

# 运行: flask run --debug

views.py

import random

from flask import Blueprint, request, render_template
from .models import *

#创建蓝图(路由)
blue = Blueprint('user', __name__)

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


# 多表操作 - 增删改查

#一对多
# 1.增加
#添加班级
@blue.route('/addgrade/')
def add_grade():
    #先添加班级
    grades = []
    for i in range(10):
        grade = Grade()     #创建班级对象
        grade.name = f'三年 - {str(random.randint(10, 99))}班'
        grades.append(grade)

    try:
        db.session.add_all(grades)
        db.session.commit()
    except Exception as e:
        print(e)
        db.session.rollback()
        db.session.flush()

    return '添加成功'

#添加学生
@blue.route('/addstu/')
def add_stu():
    #先添加班级
    students = []
    for i in range(10):
        stu = Student()
        stu.name = f'小新{i}'
        stu.age = i
        stu.gradeid = random.randint(10, 11)
        students.append(stu)

    try:
        db.session.add_all(students)
        db.session.commit()
    except Exception as e:
        print(e)
        db.session.rollback()
        db.session.flush()

    return '添加成功'


# 修改
@blue.route('/updatestu/')
def update_stu():
    stu = Student.query.first()
    stu.age = 100
    db.session.commit()

    return '修改成功'


# 删除
# 删除学生
@blue.route('/delstu/')
def del_stu():
    stu = Student.query.first()
    db.session.delete(stu)
    db.session.commit()

    return '删除成功'

# 删除班级
@blue.route('/delgrade/')
def del_grade():
    # filter_by 和 filter 都返回的是查询对象,需要通过 .first(), .all(), .scalar(), 等方法来获取实际的数据
    # grade = Grade.query.get(10) #get() 根据主键查询
    grade = Grade.query.filter_by(id=11).first()  #这里使用filter()查询必须要.first()或其他条件
    print(grade.id)
    # db.session.delete(grade)
    # db.session.commit()

    # 当删除班级后、与之相关联的学生表的gradeid字段的数据会变为null
    return '删除成功'


# 查询
@blue.route('/getstu/')
def get_stu():
    # 查询某个学生所在的班级: 反向引用grade
    stu = Student.query.get(3)
    print(stu.name, stu.age)
    print(stu.gradeid, stu.grade, stu.grade.name, stu.grade.id)

    #查询某个班级下的所有学生
    grade = Grade.query.get(11)
    print(grade.name)
    print(grade.students)   # 查询班级下的所有学生
    for stu in grade.students:  # 遍历班级下的所有学生
        print(stu.name, stu.age)


    return '查询成功'

models.py

注意:要执行数据初始化和迁移的操作

1.flask db init
2.flask db migrate
3.flask db upgrade

# 模型数据库

from .exts import db    #导入db对象

# 模型     对应数据库中的     数据库
# 类名                      表             (对表操作就是对类操作)
# 对象(变量值)               表的一行数据
# 类属性(变量名)             表字段

# 创建对象: 对象名(自定义) = 类名()
# 对象.属性名 = 表字段的值


'''
多表关系:
一对多
班级:学生   = 1:N
'''

# 模型: 类名
# 必须继承:db.Model  才是 一个模型

#班级表
class Grade(db.Model):
    # 表名
    __tablename__ = 'grade'
    # 字段
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50), unique=True)

    # 建立关联
    # 第一个参数是关联的模型名(类名)
    # 第二个参数是反向引用的名称,grade对象、让student反过来得到grade对象的名称:student.grade
    # 第三个参数:懒加载,当调用时才去加载
    # 这里的students不是字段、就是一个类属性
    students = db.relationship('Student', backref='grade', lazy=True)

    # 打印对象的名字
    # def __repr__(self):
    #     return self.id, self.name    # 返回对象的名字


# 学生表
class Student(db.Model):
    __tablename__ = 'student'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50), unique=True)
    age = db.Column(db.Integer)

    # 外键、要和Grade表中的id字段关联
    gradeid = db.Column(db.Integer, db.ForeignKey(Grade.id))  #类型要和Grade表中的id字段的一样

# db.Column :表示字段
# db.Integer :表示字段的类型 整数类型
# primary_key=true : 表示主键
# autoincrement=true : 表示自增
# db.String(50) : 表示字段的长度 相当于varchar(50)
# index=True : 表示创建索引
# db.Boolean : 表示布尔类型
# default=1 : 表示默认值
# db.Float : 表示浮点类型
# nullable=False : 表示不能为空

exts.py

from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

#初始化插件
db = SQLAlchemy()
migrate = Migrate()

#和app对象绑定
def init_exts(app):
    db.init_app(app)
    migrate.init_app(app,db)

__init__.py

from flask import Flask
from .views import blue
from .exts import init_exts


def create_app():
    app = Flask(__name__)   # 创建flask应用

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

    #配置数据库
    db_uri = 'sqlite:///sqlite3.db'     #sqlite的配置
    # db_uri = 'mysql+pymysql://root:[email protected]:3306/flask_db?charset=utf8mb4'  #mysql的配置
    app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

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

    return app

项目结构:

标签:__,多表,stu,flask,app,db,grade,models,session
From: https://www.cnblogs.com/littlecc/p/18327117

相关文章

  • SpringCloud+Vue3多对多,多表联查
    ♥️作者:小宋1021......
  • 15、flask-模型-models-表的操作-分页paginate()
    paginate()的属性属性名说明items返回当前页的内容列表has_next是否还有下一页has_prev是否还有上一页next(error_out=False)返回下一页的pagination对象prev(error_out=False)返回上一页的Pagination对象page当前页的页码pages总页数per_p......
  • 基于Python flask 的豆瓣电影top250数据评分可视化
    跟着CSDN上学习一下爬虫和简单的可视化分析,最后完成了一个简单的小项目。1.项目简介        基于Pythonflask的豆瓣电影评分可视化。通过采用Python编程语言,使用flask框架搭建影视系统,并使用相关技术实现对豆瓣网站的爬取、数据存储和可视化分析。2、成果展示:......
  • 14、flask-模型-models-表的操作-增删改查
    1.单表操作1.修改表结构接着上一步的数据迁移后、生成了表,接下来就要对表的操作这里稍微对表结构改了一下models.pyfrom.extsimportdb#导入db对象classUser(db.Model):#表名__tablename__='user'#字段id=db.Column(db.Integer,primar......
  • 如何将flask应用程序分成多个py文件?
    我的Flask应用程序当前由一个具有多个路径的文件组成,并定义了路径。有什么方法可以创建一个test.py文件,其中包含main()中未处理的路由吗?test2.py我担心test.py中的路由太多,并且希望使其可以[email protected]('/somepath')defsomehandler(......
  • 使用 Flask 时,为什么这个 html 模板不能在 Web 浏览器中呈现抓取的网站数据?
    每当我在终端中打印出抓取的数据时,它都会很好地显示抓取的数据,但每当我尝试使用PythonFlask提供它时,我使用的HTML模板不会在Web浏览器中呈现数据。如果您能帮我修复此代码。Python(Flask)文件:fromflaskimportFlask,render_templatefrombs4importBeautifulSoup......
  • python+flask计算机毕业设计社区疫情防控物资调配平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,全球公共卫生事件的频发,尤其是新冠疫情的爆发,对社区治理与应急响应能力提出了前所未有的挑战。社区作为疫情防控的第一线,其物资调配......
  • python+flask计算机毕业设计四川工商学院疫情防控系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在全球新冠疫情持续蔓延的背景下,高校作为人员密集、流动性大的特殊场所,其疫情防控工作显得尤为重要。四川工商学院作为一所集教学、科研、......
  • python+flask计算机毕业设计企业人事管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着企业规模的不断扩大与业务复杂度的提升,传统的人事管理方式已难以满足现代企业对高效、精准、自动化管理的需求。企业人事管理涉及员工......
  • python+flask计算机毕业设计外卖食品安全监管微信小程序(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展,外卖行业作为“互联网+餐饮”的典范,近年来呈现出井喷式增长态势,极大地便利了人们的日常生活。然而,外卖食品......