天天看點

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

關系映射: 一對多

文法:

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'))
)