关系型数据库使用关系把不同表关联起来,关系类型有一对一、一对多、多对多。其中一对多是最常见到的,每种关系类型都有不同的实现方式,一对多的实现方式如下:
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)
多对多的实现方式需要关联表或者称为中间表,在后续文章中安排。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)