霍格沃兹测试开发

多对多操作

霍格沃兹测试开发学社 ceshiren.com

目录

  • 多对多关系
  • 多对多表结构
  • 多对多增删查改

多对多场景

  • 一个学生对应多个老师
  • 一个老师对应多个学生
  • 定义三张表
  • 需要创建一个中间表(关系表)
  • 使用 relationship 方法关联两张表
# 创建一个中间表
teacher_student_rel = db.Table(
    # 中间表的名字,最好能体现哪两张表
    "teacher_student",
    # 其中一张表的描述,作为一个外键,指向 teacher 表的id
    Column("teacher_id", Integer, \
    ForeignKey("teacher.id"), \
    nullable=False, primary_key=True),
    # 其中一张表的描述,作为一个外键,指向 student 表的id
    Column("student_id", Integer, ForeignKey("student.id"), \
    nullable=False, primary_key=True)
)


# 创建老师的映射
class Teacher(db.Model):
    __tablename__ = "teacher"
    id = Column(Integer, primary_key=True)
    # name 老师的姓名
    # nullable=False 不为空,unique=True 唯一约束,不允许重复
    name = Column(String(100), nullable=False, unique=True)
    # 参数一:指向另一张表,另外一张表的类名
    # 参数二:secondary ,指向中间表的变量名
    # 参数三:反向指向,backref  当前表的别名
    students = relationship("Student",\
     secondary=teacher_student_rel,
                            backref= "teachers")

    def __repr__(self):
        return "<Teacher id='%s' \
        teacher_name='%s'>" % (self.id, self.name)


# 创建学生的映射
class Student(db.Model):
    __tablename__ = "student"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(100),nullable=False,unique=True)

    def __repr__(self):
        return f"<Student id='{self.id}' name='{self.name}'>"

relationship()解析

  • relationship()建立两表之间的映射关系,方便访问
    • 参数一:关联另一张表,另外一张表的类名
    • 参数二:secondary 指向中间表的变量名
    • 参数三:backref 反向引用

建表

if __name__ == '__main__':
    # 建表
    # db.create_all()
    # db.drop_all()

添加数据

  • 创建学生数据
  • 创建老师数据
  • 创建关联数据
if __name__ == '__main__':
    # 建表
    # db.create_all()
    # db.drop_all()
    # ======== 添加数据 =========
    # 添加三个学生,三个老师
    stu1 = Student(name="学生1")
    stu2 = Student(name="学生2")
    stu3 = Student(name="学生3")

    tea1 = Teacher(name="老师1")
    tea2 = Teacher(name="老师2")
    tea3 = Teacher(name="老师3")

    db.session.add_all([stu1,stu2,stu3,tea1,tea2,tea3])

    # 建立关联关系
    # 老师1 --关联-- 学生1,学生2
    # 老师2 --关联-- 学生2,学生3
    tea1.students = [stu1,stu2]
    tea2.students = [stu2,stu3]
    db.session.commit()
    db.session.close()

查询数据

  • 查询学生对应的老师
  • 查询老师对应的学生
# ======== 查询数据 =========
# 查询学生id=1 对应的老师
stu1 = Student.query.filter_by(id=1).first()
print(stu1.teachers[0].name)

# 查询老师对应的学生
tea1 = Teacher.query.filter_by(id=1).first()
print(tea1.students[0].name)

更新数据

  • 查询学生 id=1,修改对应的老师姓名
  • 查询老师 id=1,修改学生的姓名
# ======== 修改数据 =========
# 修改学生id=1 的老师姓名
# stu1 = Student.query.filter_by(id=1).first()
# stu1.teachers[0].name = "老师1修改1"


# 修改老师id=1 对应的学生姓名
tea1 = Teacher.query.filter_by(id=1).first()
tea1.students[0].name = "学生1修改1"

db.session.commit()
db.session.close()

删除数据

  • 删除学生
  • 删除老师
  • 自动删除关联关系
# ======== 删除数据 =========
# 删除学生
stu1 = Student.query.filter_by(id=1).first()
db.session.delete(stu1)
db.session.commit()


# 删除老师
tea1 = Teacher.query.filter_by(id=1).first()
db.session.delete(tea1)
db.session.commit()
db.session.close()