一、一对多
1) 在“ 多端 ”实体中增加
外键列名 = db.Column(db.Integer,db.ForeignKey('主表.主键'))
2) 在"一端"实体中增加反向引用关系
对方的属性名 = db.relationship(" 多端 的实体类名", backref="对方称呼自己的属性名", lazy="dynamic")
常用的关系选项:
选项名 | 说明 |
---|---|
backref | 在说明的另一个模型中 添加反向查询 |
lazy | 指定如何加载相关记录。 参数及含义: select: 首次 访问时加载immediate: 源对象加载后 立马 加载关联数据 subquery: 立即 加载,但使用 子查询 方式noload: 永不加载 dynamic: 不加载记录,但 提供加载记录的查询
|
uselist | 如果设置为False , 则 不使用列表 , 使用 标量
|
secondary | 指定 多对多关系 中 关联表 的名字 |
二、一对一
1) 什么是一对一
A表中的一条记录只能与B表中的一条记录关联
B表中的一条记录只能与A表中的一条记录关联
2) 在数据库中的体现
3) SQLAlchemy
class Wife(db.Model):
...
teacher_id = db.Column(db.Integer, db.ForeignKey('teacher.id'))
class Teacher(db.Model):
...
wife = db.relationShip('Wife', backref='teacher', uselist=False)
三、多对多
- 什么是多对多
A表中的一条数据可以与B中的任意多条数据关联
B表中的一条数据可以与A中的任意多条数据关联 - 实现
使用第三张表来关联(并不需要实体类)
# 1.创建第三张表
student_course = db.Table(
'student_course', # 在数据库中的表名
db.Column('id', db.Integer, primary_key=True), # 该表的主键
db.Column('student_id',db.Integer,db.ForeignKey('student.id'))
db.Column('course_id', db.Integer, db.ForeignKey('course.id'))
)
# 2.增加关联属性 以及 反向引用
class Student(db.Model):
... ...
courses = db.relationship(
'Course',
secondary = 'student_course',
lazy='dynamic',
backref=db.backref(
'students',
lazy='dynamic'
)
)