Python全棧Web(Flask框架、多表關聯)

巴黎香榭發表於2018-09-28
關係對映:
一對多
語法:
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`))
)


相關文章