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

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

猜你喜欢

转载自blog.csdn.net/qq_41772997/article/details/80356036