使用Flask框架和SQLAlchemy ORM(对象关系映射)库的Python应用程序,用于管理学生和课程的信息

1. 导入必要的库

import json
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import backref
from datetime import datetime

json: 用于处理JSON数据。
Flask: 用于创建Web应用。
SQLAlchemy: 用于数据库操作。
backref: 用于在关系中创建反向引用。
datetime: 用于处理日期和时间。

2. 初始化Flask应用和SQLAlchemy

db = SQLAlchemy()
app = Flask(__name__, template_folder="templates", static_folder="static")

db: SQLAlchemy实例,用于数据库操作。
app: Flask应用实例,配置了模板和静态文件的路径。

3. 配置Flask应用

app.config.update({
    "DEBUG": True,
    "SQLALCHEMY_DATABASE_URI": "mysql://root:123@127.0.0.1:3306/flaskdemo?charset=utf8mb4",
    "SQLALCHEMY_TRACK_MODIFICATIONS": False,
    "SQLALCHEMY_ECHO": True,
})

DEBUG: 开启调试模式。
SQLALCHEMY_DATABASE_URI: 数据库连接字符串,使用MySQL数据库。
SQLALCHEMY_TRACK_MODIFICATIONS: 禁用修改追踪,减少内存消耗。
SQLALCHEMY_ECHO: 开启SQL语句的打印,方便调试。

4. 初始化SQLAlchemy

db.init_app(app)

将SQLAlchemy实例与Flask应用绑定。

5. 定义模型

5.1 学生和课程的关系表

class StudentCourse(db.Model):
    __tablename__ = "demo_student_course"
    id = db.Column(db.Integer, primary_key=True, comment="主键")
    sid = db.Column(db.Integer, db.ForeignKey("demo_student.id"))
    cid = db.Column(db.Integer, db.ForeignKey("demo_course.id"))
    created_time = db.Column(db.DateTime, default=datetime.now, comment="购买时间")

    student = db.relationship("Student", uselist=False, backref=backref("to_relation", uselist=True))
    course = db.relationship("Course", uselist=False, backref=backref("to_relation", uselist=True))

StudentCourse 模型用于表示学生和课程之间的多对多关系。
sidcid 分别是学生和课程的外键。
created_time: 记录学生报读课程的时间。
studentcourse 是关系属性,用于访问关联的学生和课程。

5.2 学生模型

class Student(db.Model):
    __tablename__ = "demo_student"
    id = db.Column(db.Integer, primary_key=True, comment="主键")
    name = db.Column(db.String(15), comment="姓名")
    age = db.Column(db.SmallInteger, comment="年龄")
    sex = db.Column(db.Boolean, default=True, comment="性别")
    email = db.Column(db.String(128), comment="邮箱地址")
    money = db.Column(db.Numeric(10, 2), default=0.0, comment="钱包")

    def __repr__(self):
        return json.dumps(self.__to_dict__, ensure_ascii=False)

    @property
    def __to_dict__(self):
        return {
            "id": self.id,
            "name": self.name,
            "age": self.age,
            "sex": self.sex,
            "email": self.email,
            "money": float(self.money),
        }

Student 模型表示学生信息。
__to_dict__ 方法将学生对象转换为字典,方便JSON序列化。

5.3 课程模型

class Course(db.Model):
    __tablename__ = "demo_course"
    id = db.Column(db.Integer, primary_key=True, comment="主键")
    name = db.Column(db.String(64), unique=True, comment="课程")
    price = db.Column(db.Numeric(7, 2), default=0.0, comment="价格")

    def __repr__(self):
        return json.dumps(self.__to_dict__, ensure_ascii=False)

    @property
    def __to_dict__(self):
        return {
            "id": self.id,
            "name": self.name,
            "price": self.price,
        }

Course 模型表示课程信息。
__to_dict__ 方法将课程对象转换为字典,方便JSON序列化。

6. 定义路由和视图函数

6.1 创建和删除数据表

@app.route("/create")
def create_table():
    db.create_all()
    return "ok"

@app.route("/drop")
def drop_table():
    db.drop_all()
    return "ok"

/create: 创建所有定义的表。
/drop: 删除所有定义的表。

6.2 添加数据

@app.route("/a1")
def a1():
    # 添加学生和课程数据的代码
    return "ok"

/a1: 添加学生和课程数据的测试路由。

6.3 查询数据

@app.route("/q1")
def q1():
    # 查询学生报读的课程和课程的学生
    return "ok"

/q1: 查询学生报读的课程和课程的学生信息的测试路由。

6.4 更新数据

@app.route("/u1")
def u1():
    # 更新学生钱包余额的代码
    return "ok"

/u1: 更新学生钱包余额的测试路由。

7. 运行应用

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

启动Flask应用。

posted @ 2025-03-26 17:53  千陌666  阅读(35)  评论(0)    收藏  举报