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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值