python的flask框架对mysql数据库中数据表关联关系的处理 (一)one_to_many

本文介绍在Flask框架中如何实现一对多的数据库关联关系,并提供了具体代码实例,展示了如何通过外键关联实现班级与学生之间的关联查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2018.05.17*******************************************************
author:wills

当我们使用flask框架进行应用开发的时候,不可避免的需要与数据库打交道,因为我们的数据很多都是需要长久保存下来的
那么在flask中也要面对数据库中表格的一对一,一对多乃至多对多的关联关联,这些关系需要怎么处理呢,这里我详细介绍一对多的情况怎么处理

这里默认已经创建了一个flask项目,如果不会创建flask项目参见我的上一篇blog首先我有两个表分别叫Grade和Student,它们的关系是班级表中有不同的班级及其信息,学生表中有学生的名字及其相关信息,一个班级有多个学生,每个学生有自己的班级编号

# models.py 这些代码写在models.py文件中
class Grade(db.Models)
    # 设计班级表中主键
    g_id = db.Column(db.Integer, primary_key=True, autoincrement)
    g_name = db.Column(db.String(16), unique=True)
    # 这个students不是一个字段而是表示关联到Student表的外键关联,这是flask和Django中不同之处,lazy参数主要是考虑性能问题,即查询班级信息时如果lazy=Flase,无论是否有关联查询学生表,都会自己取数据库查询学生表相关信息,浪费性能。而当lazy=True时,只有确定有关联查询学生表时才会去学生表示Student查询
    students = db.relationship('Student', backref='stu', lazy=True)

    __tablename__ = 'grade'

    def __init__(self, name):
        """初始化方法,便于创建班级到数据库
        """
        self.g_name = name


class Student(db.Models)

    s_id = db.Column(db.Integer, primary_key=True, autoincrment=True)
    s_name = db.Column(db.String(16),)
    s_age = db.Column(db.Integer, default=10)
    # 外键 s_g关联到班级表,注意这里一定要先写字段s_g的类型integer
    # ‘grade.g_id’表示这个外键关联到Grade表的g_id字段
    s_g = db.Column(db.Integer, db.ForeignKey('grade.g_id'), nullable=True)

    __tablename__ = 'student'

    def __init__(self, name, age)
        """初始化方法,方便创建学生对象到数据库
        """
        self.s_name = name
        self.s_age = age
# views.py
@stu.route('/selectstu/')
def select_stu():
    # 查询学生s_id=5,或者姓名s_name=‘张山’的人是哪个班级,以及班级的名字
    # 方法一
    # 这里使用filter拿到的是一个basequery的集合,所以需要first()来获取s_id=5的学生对象
    stu = Student.query.filter(Student.s_id==5).first()
    # 方法二 因为s_id是Student的主键,可以直接用get()方法获取具体的某个对象
    stu = Student.query.get(5)
    # 学生表和班级表有外键关联,这里‘.stu’ 即Grade表中students的backref=‘stu’所关联
    stu_grade = stu.stu.g_name
    stu_gradeid = stu.s_g or stu.stu.g_id

    stu = Student.query.filter(Student.s_name=='张山').first()
    stu_grade = stu.stu.g_name
    stu_gradeid = stu.s_g or stu.stu.g_id

    # 查询g_id=2的班级有多少人
    grade = Grade.query.filter(Grade.g_id==2).first()
    # 通过外键关联students获取2班所有的学生信息
    stus = grade.students

剩下关于1 对 1 以及 多 对 多 的处理办法,关注下一篇blog

Flask框架中,将MySQL数据转换为JSON并存储到`static`文件夹需要经过以下几个步骤: 1. **设置数据库连接**: 首先安装所需的库,如`flask_sqlalchemy`用于处理SQLAlchemy与MySQL的集成,以及`flask_marshmallow`用于序列化数据到JSON格式。 ```bash pip install Flask-SQLAlchemy Flask-Marshmallow marshmallow-sqlalchemy ``` 2. **配置数据库**: 在`app.py`或其他配置模块中设置数据库连接,并创建模型(通常是基于SQLAlchemy的Model)。 ```python from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() # 创建个User Model class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), unique=True) email = db.Column(db.String(120), unique=True) # 序列化器 class UserSchema(ma.SQLAlchemyAutoSchema): class Meta: model = User ``` 3. **查询数据**: 获取用户列表或其他需要序列化的数据。 ```python users = User.query.all() # 查询所有用户 ``` 4. **序列化数据到JSON**: 使用`marshmallow`库将数据转换为JSON。 ```python from flask_marshmallow import Marshmallow ma = Marshmallow(app) user_schema = UserSchema(many=True) # 处理批量数据 json_data = user_schema.dump(users) ``` 5. **保存到`static`文件夹**: 将JSON数据保存到应用的静态文件夹,通常这个过程会在模板渲染时完成。例如,你可以创建个新的HTML页面,然后在视图函数中处理这个操作。 ```python @app.route('/export_json') def export_to_json(): with open(os.path.join('static', 'users.json'), 'w') as f: json.dump(json_data, f) return redirect(url_for('index')) # 返回主页,表示数据已导出 ``` 6. **模板中引用**: 在前端模板(如Jinja2)中,你可以通过URL访问`users.json`获取数据,假设你有如下代码: ```html <a href="{{ url_for('export_to_json') }}">Download JSON</a> <script src="{{ url_for('static', filename='users.json') }}"></script> ``` 注意,这只是个基本示例,实际生产环境中可能需要考虑错误处理、文件权限等问题。同时,直接在`static`目录下写入文件可能会导致安全性问题,因此最好使用更为安全的方式,比如写入到服务器指定的临时目录,然后通过URL分发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

披星の月

您的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值