霍格沃兹测试开发

一对多操作

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

一对多

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

一对多场景

  • 一个班级有多个学生
  • 一个学生只在一个班级
  • 一对多关系中,通过外键来关联数据,外键设置在的一方
# 班级表
class ClassInfo(db.Model):
    __tablename__ = "Class"
    id = Column(Integer, primary_key=True)
    name = Column(String(80))

# 学生表
class StudentInfo(db.Model):
    # 指定表名__tablename__属性
    __tablename__ = "Student"
    id = Column(Integer, primary_key=True)
    name = Column(String(80))
    classid = Column(Integer, ForeignKey("Class.id"))

创建表

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

添加数据

  • 分别向学生表和班级表添加数据
    • add_all() 将数据添加到 session
    • commit() 提交到数据库
    • close() 关闭连接
# ====== 数据新增 ======
# Class 班级表:添加两条数据
class1 = ClassInfo(id=1,classname="测开21期")
class2 = ClassInfo(id=2,classname="测开22期")
session.add_all([class1,class2])
session.commit()

# Student 学生表:添加两条数据
student1 = StudentInfo(id=1,username="学生一",class_id=1)
student2 = StudentInfo(id=2, username="学生二", class_id=1)
student3 = StudentInfo(id=3, username="学生三", class_id=2)
student4 = StudentInfo(id=4, username="学生四", class_id=2)
session.add_all([student3,student4])
session.commit()

session.close()

查询数据- 多查一

class StudentInfo(db.Model):
    # 指定表名__tablename__属性
    __tablename__ = "Student"
    id = Column(Integer, primary_key=True)
    name = Column(String(80))
    classid = Column(Integer, ForeignKey("Class.id"))
##### 添加代码 ######
# 第一个参数:表示这个关系的另一端是 ClassInfo 类。比如班级id=1
# 第二个参数:backref, 表示反向引用,需要从班级id为1 反向获取【多】的时候,使用的属性
    classinfo = db.relationship("ClassInfo", backref="studentinfo")
# 多查一  id为1的学生 对应的班级
stu1 = StudentInfo.query.filter_by(id=2).first()
# 直接通过属性获取 classid
print(stu1.classid)
# 反向获取 类的属性
print(stu1.classinfo.id)
print(stu1.classinfo.name)

查询数据 - 一查多

# 一查多  id为1的班级里的所有学生
class1=ClassInfo.query.filter_by(id=1).first()
print(class1.studentinfo)

修改数据

  • 先查询,再修改
  • 修改之后要 commit()
# ====== 数据修改 ======
# 由一改多 数据修改
class1 = ClassInfo.query.filter_by(id=1).first()
print(class1.studentinfo[0].name)
class1.studentinfo[0].name = "学生一修改1"
session.commit()
session.close()

# 由多改一
stu1 = StudentInfo.query.filter_by(id=1).first()
print(stu1.classinfo.name)
stu1.classinfo.name = "测开21期修改1"
session.commit()
session.close()

删除数据

# ====== 数据删除 ======
# 删除用的很少,几乎不用,了解即可
# 删除一个班级下所有的学生
class1 = ClassInfo.query.filter_by(id=1).first()
print(StudentInfo.classid)
# 注意这里用的是filter 不是filter_by
StudentInfo.query.filter( StudentInfo.classid==class1.id).delete()
session.commit()
session.close()
# 删除之后查询结果
print(StudentInfo.query.all())