1. 一对一关系
主要通过一个 uselist=False 来约束, 因为在一对多中通过 查询得到的是一个列表, 所以, uselist=False禁用列表, 使我们只能查找到一个, 就构成了一对一关系
人和身份证的一对一一关系
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class Persion(db.Model): __tablename__ = 'tb_persion' p_id = ... #主键字段 ... ident_id = db,Column(db.Integer, db.ForeignKey('tb_ident.id')) class Ident(db.Model): __tablename__ = 'tb_ident' id = # 主键字段 ... persion = db.relationship('User', backref='ident', uselist=False)
2. 一对多关系
班级和学生是一对多关系, 一个班级中可以有多个学生
学生 和 班级 模型
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class Student(db.Model): # Many __tablename__ = 'tb_student' s_id = # 主键 ... s_grade = db.Column(db.Interger, db.ForeignKey('tb_grade.g_id')) class Grade(db.Model): # one __tablename__ = 'tb_grade' c_id = # 主键 ... students = db.relationship('Student', backref='stu', lazy=True)
backref 字段主要是用于通过建立的联系, 来进行反向查询, 例如, Student 可以通过 Grade 模型中关联的 'stu', 来进行查询班级
3. 多对多关系
多对多关系主要是要创建中间表, 不同于 Django 的是 Flask 的中间表要我们自己书写, 并且在其中添加关联关系
关键在于 relationship , 这个关联关系可以放在两张表的任意一张表中, 但是不可以放在中间表中
relationship 中的 secondary 是中间表
学生表 和 课程表 是 多对多关系, 一个学生可以选择多门课程, 一个课程也可以有多个学生选择
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class Student(db.Model): __tablename__ = 'tb_student' s_id = ... # 主键字段 ... class Course(db.Model): __tablename__ = 'tb_course' c_id = ... # 主键字段 ... students = db.relationship('Student', secondary=sc, backref='course') # 中间表 sc = db.Table('sc', db.Column('s_id', db.Integer, db.ForeignKey('tb_student.s_id'), primary_key=True), db.Column('c_id', db.Integer, db.ForeignKey('tb_course.c_id'), primary_key=True) )
4.添加删除联系和查询
添加学生和课程之间的关系
通过页面中传递学生的id和课程的id,分别获取学生的对象和课程的对象,在使用关联关系append去添加学生对象,并且add以后再commit后,就可以在中间表sc中查看到新增的关联关系了。
userid = request.form.get('userid') courseid = request.form.get('courseid') stu = Student.query.get(userid) cou = Course.query.get(courseid) cou.students.append(stu) db.session.add(cou) db.session.commit()
删除学生和课程之间的关系
通过页面获取传递的学生的id和课程的id,分别获取学生对象和课程对象,在使用关联关系remove去删除学生对象,并commit将事务提交到数据库中
stu = Student.query.get(s_id) cou = Course.query.get(c_id) cou.students.remove(stu) db.session.commit()
通过课程查询学生的信息
以下定义在课程course的模型中,所以通过课程查询学生的信息,语法为课程的对象.studengs。如果知道学生的信息反过来找课程的信息,则使用backref的反向关联去查询,语语法为学生的对象.cou(反向)
students = db.relationship('Student',secondary=sc,backref='cou')
cou = Course.query.get(2) stus = cou.students