FLASK-SQLALCHEMY 关系映射

一、一对多

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)

三、多对多

  1. 什么是多对多
    A表中的一条数据可以与B中的任意多条数据关联
    B表中的一条数据可以与A中的任意多条数据关联
  2. 实现
    使用第三张表来关联(并不需要实体类)
# 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'
    )
)

你可能感兴趣的:(FLASK-SQLALCHEMY 关系映射)