• 一对多关系
  • 多对一关系
  • 多对多关系
  • 一对一关系

一对多关系(一个作者,多篇文章)

## 一对多关系,单作者-多文章,外键不可少
## 外键(ForeignKey)总在多的那边定义,关系(relationship)总在单的那边定义 class Author(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(70), unique=True)
phone = db.Column(db.String(20))
# articles为关系属性(一个集合,可以像列表一样操作,在关系的出发侧定义
## relationship()函数的第一个参数为关系另一侧的模型名称(Article)
articles = db.relationship('Article') class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(15), index=True)
body = db.Column(db.Text)
# 传入ForeignKey的参数形式为:"表名.字段名"
## 模型类对应的表名由Flask-SQLAlchemy生成,默认为类名称的小写形式,多个单词通过下划线分隔
author_id = db.Column(db.Integer, db.ForeignKey('author.id')) # # 外键字段(author_id)和关系属性(articles)的命名没有限制
## 建立关系可通过操作关系属性进行
>>>shansan = Author(name="shansan")
>>>hello = Article(title="Hello world !")
>>>boy = Article(title="Hello Boy !")
>>>db.session.add(shansan) # 将创建的数据库记录添加到会话中
>>>db.session.add(hello)
>>>db.session.add(boy)
>>>shansan.articles.append(hello) # 操作关系属性
>>>shansan.articles.append(boy)
>>>db.session.commit()

基于一对多的双向关系(bidirectional relationship)

在这里我们希望可以在Book类中存在这样一个属性:通过调用它可以获取对应的作者的记录,这类返回单个值的关系属性称为标量关系属性

# 建立双向关系时,关系两边都有关系函数
# 在关系函数中,我们使用back_populates参数连接对方,参数的值设置为关系另一侧的关系属性名
class Writer(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
# back_populates的参数值为关系另一侧的关系属性名
books = db.relationship('Book', back_populates='writer') def __repr__(self):
return '<Writer %r>' % self.name class Book(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), index=True)
writer_id = db.Column(db.Integer, db.ForeignKey('writer.id')) writer = db.relationship('Writer', back_populates='books') def __repr__(self):
return '<Book %r>' % self.name # 设置双向属性后,我们既可以通过集合属性操作关系,也可通过标量关系属性操作关系

多对一关系(多个市民都在同一个城市)

# 外键总在多的一侧定义
## 多对一关系中,外键和关系属性都在多的一侧定义
## 这里的关系属性是标量关系属性(返回单一数据)
class Citizen(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), unique=True)
city_id = db.Column(db.Integer, db.ForeignKey('city.id'))
city = db.relationship('City') class City(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), unique=True)

一对一关系(国家和首都)

## 一对一关系,将关系函数的uselist参数设为False,使得集合关系属性无法使用列表语义操作
## 这里使用的是一对一双向关系 class Country(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), unique=True)
capital = db.relationship('Capital', uselist=False) class Capital(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), unique=True)
country_id= db.Column(db.Integer, db.ForeignKey('country.id'))
country = db.relationship('Country')

多对多双向关系(老师和学生)

  • 多对多关系的建立需要使用关联表(association table)。关联表不存储数据,只用来存储关系两侧模型的外键对应关系
  • 定义关系两侧的关系函数时,需要添加一个secondary参数,值设为关联表的名称
  • 关联表由使用db.Table类定义,传入的第一个参数为关联表的名称
  • 我们在关联表中将多对多的关系分化成了两个一对多的关系
## 多对多关系,使用关联表(association table),关联表由db.Table定义
## 关系函数需要设置secondary参数,值为关系表名 association_table = db.Table('association_table',
db.Column('student_id', db.Integer, db.ForeignKey('teacher.id')),
db.Column('teacher_id', db.Integer, db.ForeignKey('student.id'))
) class Student(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(70), unique=True)
grade = db.Column(db.String(20))
teachers = db.relationship('Teacher', secondary=association_table,back_populates='students') class Teacher(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(70), unique=True)
office = db.Column(db.String(20))
students = db.relationship('Student', secondary=association_table, back_populates='teachers')

常用的SQLAlchemy关系函数参数和常用的SQLAlchemy关系记录加载方式(lazy参数可选值)

  • 使用关系函数定义的属性不是数据库字段,而是类似于特定的查询函数
  • 当关系属性被调用时,关系函数会加载相应的记录

相关

http://www.sqlalchemy.org/

https://github.com/sqlalchemy/sqlalchemy

https://github.com/mitsuhiko/flask-sqlalchemy

SQLAlchemy建立数据库模型之间的关系的更多相关文章

  1. Django数据库的查看、删除,创建多张表并建立表之间关系

    配置以下两处,可以方便我们直接右键运行tests.py一个文件,实现对数据库操作语句的调试: settings里面的设置: #可以将Django对数据库的操作语法,能输出对应的的sql语句 LOGGI ...

  2. MySQL数据库:SQL语句基础、库操作、表操作、数据类型、约束条件、表之间的关系

    数据库相关概念: 1. 数据库服务器:运行数据库管理软件的计算机 2. 数据库管理软件:MySQL.Oracle.db2.slqserver 3. 库:文件夹,用来组织文件/表 4. 表:文件(类似于 ...

  3. MySql系列表之间的关系

    foreign key 快速理解foreign key   员工信息表有三个字段:工号  姓名  部门 公司有3个部门,但是有1个亿的员工,那意味着部门这个字段需要重复存储,部门名字越长,越浪费 数据 ...

  4. mysql 中表与表之间的关系

    如何找出两张表的对应关系 分析步骤: 1.先找出左表的角度去找 ​ 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段 (通常是id) 2.再站 ...

  5. ALSA声卡驱动中的DAPM详解之五:建立widget之间的连接关系

    前面我们主要着重于codec.platform.machine驱动程序中如何使用和建立dapm所需要的widget,route,这些是音频驱动开发人员必须要了解的内容,经过前几章的介绍,我们应该知道如 ...

  6. [转] valuestack,stackContext,ActionContext.之间的关系

    三者之间的关系如下图所示: ActionContext  一次Action调用都会创建一个ActionContext  调用:ActionContext context = ActionContext ...

  7. flask SQLAlchemy中一对多的关系实现

    SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系, 其中一对多是一种比较常见的关系.利用flask sqlalchemy实现一对多的关系如 ...

  8. 谈谈Activiti中流程对象之间的关系

    详细见:http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html (咖啡兔好牛!) 详细见: http://blo ...

  9. valuestack,stackContext,ActionContext.之间的关系

    者之间的关系如下图所示: relation ActionContext 一次Action调用都会创建一个ActionContext 调用:ActionContext context = ActionC ...

随机推荐

  1. 「NOI2005」维护数列

    「NOI2005」维护数列 传送门 维护过程有点像线段树. 但我们知道线段树的节点并不是实际节点,而平衡树的节点是实际节点. 所以在向上合并信息时要加入根节点信息. 然后节点再删除后编号要回退(栈), ...

  2. 人物 - Larry Elison

    甲骨文公司创始人 甲骨文公司首席執行官 狂人,偏执狂 曾说:"Winning is not enough. All others must lose" Only the paran ...

  3. 10.MongoDB

    1.安装(1.1):去官方下载最新的包,http://www.mongodb.org/downloads(1.2):然后tar zvxf 解压(1.3):拷贝到相应的文件夹即可2.在Shell里面启动 ...

  4. Netty实现原理和使用

    参考: https://www.jdon.com/concurrent/netty.html Java NIO原理和使用 参考:https://www.jdon.com/concurrent/nio% ...

  5. Acwing779 最长公共字符串后缀

    题目大意:给定n个字符串,让你找到他们的最长公共字符串后缀是什么,可能为空. 分析:题目数据范围比较小,可以O(n*n)暴力匹配,即可解决这道问题.之所以写这道题的题解还是因为写字符串的题还不够多啊, ...

  6. postgres登录失败Connection refused与SSL off失败

    连接失败问题 使用postgres数据库连接工具测试,遇到两次失败 第一个登录失败问题 Connection to 192.168.XX.XX:5432 refused. Check that the ...

  7. Android APK反编译就这么简单 详解(附图)--转

    转自:http://blog.csdn.net/vipzjyno1/article/details/21039349/ 在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮 ...

  8. JS中的鼠标移入移除监控操作

    有些时候我们需要通过页面来监控用户的行为,包括鼠标操作键盘操作,本文章介绍的是鼠标的操作监控: <script> window.onload = function(){ var oDiv ...

  9. R语言 使用rmarkdown写代码

    1.如果是第一次新建markdown文件,需要在有网的条件下,因为要下载一个包才能用markdown 2.为什么使用rmarkdown 使用markdown不仅可以边调试边运行,还可以一次性将所调试好 ...

  10. 「CF600E」Lomsat gelral

    传送门 Luogu 解题思路 线段树合并板子题(也可以 dsu on the tree) 好像没什么好讲的,就是要注意开 long long . 细节注意事项 咕咕咕 参考代码 #include &l ...