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

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

你可能感兴趣的:(大杂烩,flask,表关系,SQLAlchemy一对多,SQLAlchemy一对一)