Flask-SQLAlchemy(三)—— 表关系

        关系型数据库使用关系把不同表关联起来,关系类型有一对一、一对多、多对多。其中一对多是最常见到的,每种关系类型都有不同的实现方式,一对多的实现方式如下:

class Role(db.Model):  # 所有的数据库模型均继承自 db.Model 类
    __tablename__ = 'roles'  # 一般会指定表名,虽然有默认机制,但不一定是我们想要的结果
    id = db.Column(db.Integer, primary_key=True)  # 类变量代表表的列名,使用 db.Column 对象定义, db.Integer代表列的数据类型
    name = db.Column(db.String(64), unique=True)  # primary_key、unique 代表字段约束
    # 添加users类变量方便通过Role对象直接找到相关的User,第一个参数代表的先关模型的类名
    # backref代表向User对象反向注射role属性,方便通过User直接查找对应的role
    users = db.relationship('User', backref='role')

    def __repr__(self):
        return '<Role {}>'.format(self.name)


class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))  # db.ForeignKey表示定义外键,为roles表的id字段

    def __repr__(self):
        return '<Role {}>'.format(self.username)

        这是在上一节中已经提到的用户与角色相关的实体类,一个用户对应一种角色,一种角色对应多个用户。users表中的role_id被指定为外键,使用db.ForeignKey('roles.id')指定外键指向roles表中的id字段,这样一堆多的关系就建立起来了。

        需要注意的是,多数情况下db.relationship()都能自动找到users表中的外键,从而确定users属性的值。但有时无法确定哪一列才是外键。比如users表中有两个定义roles表的外键,这个时候就需要提供额外的参数执行关联字段。db.relationship()常用表关系选项如下:

选项名说明
backref在关系的另一个模型中添加反向引用
promaryjoin明确指定关联条件
lazy

指定如何加载相关数据:

select:首次访问时按需加载

immediate:源对象加载后就加载

joined:加载数据,但使用联结

subquery:立即加载,但使用子查询

noload:永不加载

dunamic:不加载记录,但提供加载记录的查询

uselist如果是False,不使用列表,使用标量值
order_by指定数据的排序方式
secondary指定多对多关系中关联表的名称
secondaryjoin手动指定多对多关系中的二级关联条件

除了一对多、还有一对一、多对多。一对一的实现方式比较简单,添加userlist参数,如下:

 users = db.relationship('User', backref='role', uselist=False)

多对多的实现方式需要关联表或者称为中间表,在后续文章中安排。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值