大家好,我是金鱼座,一个走在测试领域这片蓝海中, 蹉跎前行的技术渣渣,唯有一直走下去,也许能改变点什么,加油!
之前学习flask创建数据模型的时候,经常会遇到relationship,外键关联, backref等字眼,由于对这方面知识不是特别熟悉, 所以极大的加深了理解难度, 虽然网上也有相关的表关联的案例,但是对于理解方面没有做过多的说明, 在此,通过学习按照自己的理解进行总结,也希望自己有所加深理解,通过也可以给跟我一样脑袋回路长的朋友一点方向
模型创建
对于日常Flask建表,都是通过建立相应的模型类,进行表操作,见eg:
class User(db.Model):
"""用户表"""
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), nullable=False)
上面就是一个普通的见表操作, tablename是表示当前表名称,id, name为表字段,至于Integer, String则是对应的属性
对于这个大家很好理解
外键关联
可是我们经常看到的别人使用的外键关联是如何在模型类中体现的呢?
class Role(db.Model):
__tablename__ = 'role'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), nullable=False) # 角色
users = db.relationship("User", backref='role')
class User(db.Model):
__tablename__ = "user"
...
role_id = db.Column(db.Integer, db.ForeignKey("role.id"))
对于一般的关联, 可以通过如上所示中的ForeignKey和relationship来进行处理
那么这两个如何方便理解呢?
-
ForeignKey
外键,表示当前的字段绑定了其他表中的某一个字段,上面为绑定“role.id”, 建立了外键关系 -
relationship
首先它不是一个字段,这个大家必须要明白, 当我们执行db.create的时候, role中的users并不会被记录到数据库字段中,在这个地方,我的个人理解是可以把他当作一个方法对象,可以让Role的实例化对象进行调用
users = db.relationship("User", backref='role')
上面这句,我们就可以这样理解, Role实例化一个role对象后,
如何它想了解这个角色下有那些人,那么就可以通过role.users进行调用
如果User想了解具体的这个人的role角色信息,那么就可以user.role来进行调用(此处可能有人会比较奇怪,为什么不是user.role_id, 这个调用本身没有错,确实可以理解为查看这个user下的角色,但是如果我们想了解角色的具体信息,那么按照正常操作下,还需要操作一下Role进行一下query查询,通过Role.id = user.role_id, 但是这样就等于是两次查询,而relationship的作用就包含了backref,通过反射可以让user实例直接backref调用“role”来直接获取对应的值)
总的来说, relationship这个聚合了两个功能
- 通过“User”, 可以直接让Role实例直接获取所有的关联的User的数据实例
- 通过backref, 可以让User反射获取到这个user实力所关联的Role中的指定role_id的数据实例
网友评论