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表示Course和Student的关联关系,secondary=sc,表示他们的关联表
# backref=’course‘表示学生查找班级时的办法
studens = db.relationship('Student', secondary=sc, backref='course')
__tablename__ = 'course'
def __init__(self, name)
self.c_name = name
# 为了方便处理两张表的多对多关系,引入了第三张表sc专门管理Student和Course的关联关系
# 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 '删除成功'