摘要:关系关系数据库通过使用关系在不同的表中建立连接。以下部分将介绍最常见的数据库操作。如果数据库已存在函数不会重新创建或更新数据库表。到目前为止对象只存于中,他们还没有被写入数据库。数据库会话也叫事务。删除行数据库会话同样有方法。
7、关系
关系数据库通过使用关系在不同的表中建立连接。图像5-1的关系图表达了用户和用户角色之间的简单关系。这个角色和用户是一对多关系,因为一个角色可以从属于多个用户,而一个用户只能拥有一个角色。
示例5-3的模型类展示了图像5-1中表达的一对多关系。
示例5-3. hello.py:关系
class Role(db.Model): # ... users = db.relationship("User", backref="role") class User(db.Model): # ... role_id = db.Column(db.Integer, db.ForeignKey("roles.id"))
就像图像5-1中看到的那样,关系通过使用外键来连接两行。添加给User模型的role_id列被定义为外键,且建立关系。db.ForeignKey()的参数roles.id指定的列应该理解为在roles表的行中持有id值的列。
添加到Role模型的users属性表现了关系的面向对象的观点。给定Role类的实例,users属性会返回一组连接到该角色的用户。指定给db.relationship()的第一个参数表明模型中关系的另一边。如果类还未定义,这个模型可以作为字符串提供。
注意:之前在segmentdefault中遇到的问题,后来粗略阅读了SQLAlchemy的源码。ForeignKey类的column接收三种类型的参数,一种是“模型名.属性名”;一种是“表名.列名”,最后一种没看明白,下次试着用一下。
db.relationship()的backref参数通过给User模型增加role属性来定义反向关系。这个属性可以替代role_id访问Role模型,是作为对象而不是外键。
大多数情况下db.relationship()可以定位自己的外键关系,但是有时候不能确定哪个列被用作外键。例如,如果User模型有两个或更多列被定义为Role的外键,SQLAlchemy将不知道使用两个中的哪一个。每当外键配置模棱两可的时候,就必须使用额外参数db.relationship()。表格5-4列出一些常用配置选项用于定义关系。
表格5-4. 常用SQLAlchemy关系选项