使用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 模型用于表示学生和课程之间的多对多关系。
• sid 和 cid 分别是学生和课程的外键。
• created_time: 记录学生报读课程的时间。
• student 和 course 是关系属性,用于访问关联的学生和课程。
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应用。

浙公网安备 33010602011771号