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

2018.05.18*******************************************************
author: wills

上篇blog介绍了flask-sqlalchemy数据库表格1对多关系的处理,这里介绍另一种关联关系
m –> n
多对多
many to many

假设有两张表,学生表Student,课程表Course
一个学生可以选择多门课程,一门课程可以被多个学生选择,所以这两个表格的关系是多对多

# models.py
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

class Course(db.Model)

    c_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    c_name = db.Column(db.String(16), unique=True)

    # students表示CourseStudent的关联关系,secondary=sc,表示他们的关联表
    # backref=’course‘表示学生查找班级时的办法
    studens = db.relationship('Student', secondary=sc, backref='course')

    __tablename__ = 'course'

        def __init__(self, name)
            self.c_name = name


# 为了方便处理两张表的多对多关系,引入了第三张表sc专门管理StudentCourse的关联关系
# sc这个表只有2个字段s_id与c_id(它们都是主键,并且又都是外键分别关联学生表和课程表),
# 分别关联到学生表s_id和课程表c_id,
sc = db.Table('sc', db.Column(db.Integer, db.ForeignKey('student.s_id'),primary_key=True),
                        db.Column(db.Integer, db.ForeignKey('course.c_id'), primary_key=True))


def create_db():
    """在数据库中创建对应的三个表
    """
    db.create_all()

    return 'ok'


# 表格创建完成,需要往其中添加相应的数据,我这里直接使用sql语句,Course表和Student表都没有问题,关键是
# 关联的sc表。假设Course表有5门课:1 -- math,2 -- physics,3 --history,4 -- chemistry,5 -- chinese
# 学生有三个id为1,2,3每人至少选了3门课,那么如何添加学生和课程的关系到sc表

def add_stu_cou():
    #添加 学生1的课程 课程id: 1, 2, 3
    # 首先拿到,对应学生对象和对应的三个课程对象
    stu = Student.query.get(1)
    cou1 = Course.query.get(1)
    cou2 = Course.query.get(2)
    cou3 = Course.query.get(3)

    # 然后将其添加到中间表sc。添加append  删除remove
    # 两表的关系是多对多,可以用学生对象找课程,也可以用课程找学生对象

    # 课程对象找学生对象
    cou1.students.append(stu)
    cou2.students.append(stu)
    # 学生对象找课程
    stu.course.append(cou3)
    cou = [cou1, cou2, stu]

    db.session.add_all(cou)
    db.session.commit()

    return '添加关联关系到sc表成功'


def delete_stu_course(s_id, c_id):
    """在中间表sc中删除学生与课程的关联关系
        s_id:学生的id
        c_id:学生对应课程的id
    """
    stu = Student.query.get(s_id)
    cou = Course.query.get(c_id)

    # 方法一 通过课程找学生删除
    cou.students.remove(stu)

    # 方法二 通过学生找课程删除
    stu.course.remove(cou)

    db.session.commit()

    return '删除成功'

猜你喜欢

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