文法:
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'))
)