关系映射:
一对多
语法:
1."多"实体中
外键列名=db.Column(db.Integer,db.ForeignKey('主表.主键'))
2."一"实体中
增加反向引用关系
属性名=db.relationship('多表实体类名',关系选项)
常用的关系选项:
选项名 说明
backref 在关系的另一个模型中添加反向引用
lazy 指定如何加载相关记录
select : 首次访问时加载
immediate : 源对象加载后立马加载关联数据
subquery : 立即加载,但使用子查询
noload : 永不加载
dynamic : 不加载记录,但提供加载记录的查询
uselist
如果设置为False,则不使用列表,使用标量
secondary 指定多对多关系中关联表的名字
class Course(db.Model):
__tablename__ = "course"
id = db.Column(db.Integer,primary_key=True)
cname = db.Column(db.String(30))
#反向引用:返回与当前课程相关的teacher列表
#backref:定义反向关系,本质上会向Teacher实体中增加一个course属性.
# 该属性可替代course_id来访问Course模型.此时获得到的是模型对象,而不是外键值
teachers=db.relationship('Teacher',backref='course',lazy='dynamic')
def __init__(self,cname):
self.cname = cname
def __repr__(self):
return "<Course %r>" % self.cname
class Teacher(db.Model):
__tablename__='teacher'
id = db.Column(db.Integer,primary_key=True)
tname = db.Column(db.String(30))
tage = db.Column(db.Integer)
# 增加一列 : course_id,外键列,要引用自主键表(course)的主键列(id)
course_id = db.Column(db.Integer,db.ForeignKey('course.id'))
def __init__(self,tname,tage):
self.tname = tname
self.tage = tage
def __repr__(self):
return "<Teacher %r>" % self.tname
一对一
A表中的一条记录只能与B表中的一条记录相关联
B表中的一条记录只能与A表中的一条记录相关联
class Teacher(db.Model):
__tablename__='teacher'
id = db.Column(db.Integer,primary_key=True)
tname = db.Column(db.String(30))
tage = db.Column(db.Integer)
#增加反向引用,与 Wife 实体类做一对一引用.允许在Teacher中得
# 到一个Wife的信息.同时,在Wife中也能的到一个Teacher的信息
# uselist=False , 查询出来的是一个对象,而不是一个列表
wife = db.relationship('Wife',backref='teacher',uselist=False)
def __init__(self,tname,tage):
self.tname = tname
self.tage = tage
def __repr__(self):
return "<Teacher %r>" % self.tname
class Wife(db.Model):
__tablename__ = 'wife'
id = db.Column(db.Integer,primary_key=True)
wname = db.Column(db.String(30))
wage = db.Column(db.Integer)
#增加一个列:表示引用自teacher表的主键
teacher_id = db.Column(db.Integer,db.ForeignKey('teacher.id'))
def __init__(self,wname,wage):
self.wage = wage
self.wname = wname
def __repr__(self):
return "<Wife %r>" % self.wname
多对多
A表中的一条数据可以与B表中的任意多条数据相关联
B表中的一条数据可以与A表中的任意多条数据相关联
多对多的实现:
使用第三张表来关联(并不需要实体类)
创建第三张表
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"))
)
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('couse_id',db.Integer,db.ForeignKey('course.id'))
)