sqlalchemy表之间的关系有三种:1、多对多  2、一对多  3、一对一
下面就讲讲sqlalchemy表之间如何建立多对多关系。 
首先,我们把两个需要做多对多关系的模型定义出来,这里以Arctire,Tag模型为例(示例代码如下)
class Arctire(Base): 
__tablename__ = "arctire"  
id = Column(Integer , primary_key=True , autoincrement=True)  
name = Column(String(50) , nullable=False)  
tags = relationship("Tag", backref="arctires", secondary=arctire_tag)
def __repr__(self):
return "name:%s"%self.name
class Tag(Base):  
__tablename__ = "tag"  
id = Column(Integer , primary_key=True , autoincrement=True)  
tag = Column(String(50) , nullable=False)
def __repr__(self):
return "tag:%s"%self.tag
 
表多对多关系需要定义一张中间表来绑定它们之间的关系。我们通过Table来定义一张中间表(Table需从sqlalchemy中导入)

arctire_tag = Table(
"arctire_tag"       #表名
Base.metadata   #表继承的类
Column(“arctire_id” , Integer , primary_key=True , ForeignKey("arctire.id")      #arctire_id 为字段名
Column("tag_id" , Integer , primary_key=True , ForeignKey("tag.id")   
)

用Table定义好中间表后,我们在两个模型中随便选择一个模型定义relationship属性(在这里,我们以Arctire模型为例,你也可以选择在Tag模型定义),并传入 seconday = "中间表对象”(代码如下所示,红色文字为我们添加的)


class Arctire(Base):  
__tablename__ = "arctire" 
id = Column(Integer , primary_key=True , autoincrement=True)  
name = Column(String(50) , nullable=False)  
tags = relationship("Tag", backref="arctires", secondary=arctire_tag)

最后一步,点击运行。运行无误,然后在mysql命令行工具输入 show create tabel arctire_tag ,如下图所示:

代码详解:

PRIMARY KEY("user_id","tag_id")    #user_id,tag_id 字段被封装成复合主键
CONSTRAINT "arctire_tag_ibfk_1" FOREIGN KEY ("user_id”) REFERENCES "arctire” ('id")     #  表示user_id 这个字段引用自arctire表中的id字段
CONSTRAINT "arctire_tag_ibfk_2" FOREIGN KEY ("tag_id”) REFERENCES "tag” ('id")     #  表示tag_id 这个字段引用自tag表中的id字段
出现上方信息,表明表多对多关系创建成功。下面我们添加数据测试一下

arctire1 = Arctire(name = "arctire1")
arctire2 = Arctire(name = "arctire2")

tag1 = Tag(tag = "tag1")
tag2 = Tag(tag = "tag2")

arctire1.tags.append(tag1)
arctire1.tags.append(tag2)

arctire2.tags.append(tag1)
arctire2.tags.append(tag2)

session.add(arctire1)
session.add(arctire2)
session.commit()

然后在命令行工具分别查询arctire,tag,arctire_tag表中的数据
1、select * from arcitre;

2、select * from tag;

3、select * from arctire_tag; (注: user_id1 表示arctire1 ,tag_id 表示tag1......以此类推)

通过上图我们可以发现,数据成功添加入到表中,然后我们从表中查询一下,以此来验证两张表是否成功建立多对多关系。

1、从arctire表中查询所有的标签
arctire = session.query(Arctire).first()
print(arctire.tags)

运行结果如下所示:

2、反之,我们也可以从标签表中查询到标签所被引用的所有文章。

sqlalchemy表关系之多对多相关推荐

  1. MySQL笔记——外键约束和表关系(一对一,多对一,多对多)

    一.外键约束 概念:外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性.语法:(1)添加约束-- 创建表是添加外键约束CREATE TABLE 表名(列名 数据类型,-[CONSTRAINT ...

  2. Hibernate入门之关系篇:多对一和一对多映射

    关联关系映射,是对象映射关系中相对复杂的一种,但也是用处最多的一种,因为数据中的表不可能都是单独存在,彼此之间必定存在千丝万缕的联系,这也是关系型数据库的特征所在.同样关联关系的映射,也是对象关系映射 ...

  3. 5.Django|模型层--多表关系

    多表操作 文件为 ---->  orm2 数据库表关系之关联字段与外键约束 一对多Bookid title price publish email addr1 php 100 人民出版社 111 ...

  4. hibernate_day03_MySQL数据库-表与表之间的多对多关系-实例

    hibernate_day03_MySQL数据库-表与表之间的多对多关系-实例 : 操作环境 :Windows 10 教育版.eclipse.MySQL数据库.SQLyog数据库管理工具 MySQL ...

  5. hibernate 表关系映射详解之多对多

    举例:商品类型表与商品表,每种类型对应多个商品,每个商品对应多种类型 关系图: hirbernate实现多对多映射有两种方法,第一种是通过中间表直接映射,第二种是通过中间表间接映射. 直接映射: 配置 ...

  6. Django删除多对多表关系 :

    删除多对多表关系 : # 删除子表与母表关联关系,让小虎不喜欢任何颜色 # 写法1: child_obj = Child.objects.get(name="apollo") co ...

  7. 数据库建表-- 一对多/多对一/一对一/多对多 关系

     转自: https://blog.csdn.net/zhongshan_c/article/details/8210196 数据库建表-- 一对多/多对一/一对一/多对多 关系 关联映射:一对多 ...

  8. MySQL 基础 -- 多表关系(一对一、1对多(多对一)、多对多)、多表查询(内连接、外连接、自连接、子查询(嵌套查询)、联合查询 union)、笛卡儿积

    文章目录 1. 多表关系 1.1 一对多 1.2 多对多 1.3 一对一 2. 多表查询 2.1 数据准备 2.2 概述 2.3 笛卡尔积 2.4 多表查询分类 3. 内连接 3.1 示例1:查询每一 ...

  9. 【九,MySQL】基础篇--多表查询(多表关系:一对多/多对一,多对多,一对一)

    一,多表关系 1,一对多(多对一) 2,多对多 # =====================================================多对多================== ...

最新文章

  1. Java的Redis连接池代码性能不错
  2. 直播活动丨BMMeetup第2期:大模型计算加速技术,2场特邀和7位青年学者技术报告联袂上演...
  3. PHP全栈开发(八):CSS Ⅸ dispaly visibility
  4. python安装的模块在pycharm中能用吗_pycharm内无法import已安装的模块问题解决
  5. hdu 5692 Snacks(dfs序+线段树区间更新)
  6. mysql 2003 10038_关于MySql10038错误的完美解决方法(三种)
  7. wait 和 sleep 区别
  8. html+xml+js语言切换插件,你在Eclipse中使用什么CSS / JS / HTML / XML插件?
  9. XP建立隐藏的超级用户
  10. 基于PyQt5实时曲线绘制源代码和串口调试助手源代码带文件保存加载十六进制显示Python两个工程的源代码
  11. 谷歌浏览器如何自动运行flash
  12. 电信网通竞合协议事件升级 内部文件泄露曝裂痕
  13. c语言写定时闹钟程序,定时闹钟C语言程序.doc
  14. 4484: [Jsoi2015]最小表示
  15. 实验七 计数器及其应用
  16. 上海电子计算机学校招生要什么条件,【上海市致远中学招生简章/入学条件|上海市致远中学】- 上海房天下...
  17. java 面板图形保存_如何使Java窗体变成jpg格式的图片并进行保存
  18. 【工作笔记】zynq 7035移植linux系列1——linux环境的搭建和移植
  19. 将图片导出到excel表格中
  20. HTML5学习(07)文档/段落

热门文章

  1. 【paddle】paddlenlp
  2. 【百日刷题计划 第九天】——熟悉字符串 字符串基础题
  3. 学霸推荐的专注人工智能的原创公众号
  4. 用计算机写一份心得体会,最新计算机心得体会范文(通用6篇)
  5. sklearn的随机森林实现泰坦尼克号旅客生存预测
  6. 计算机毕业设计-基于SSM的ERP报销系统-JavaWebERP报销系统
  7. 【1】AI模型转换综述
  8. 计算机音乐行者,“音乐行者”胡渭康:这首歌是“心灵鸡汤”
  9. 通过HSV色彩空间对图像进行特定部分提取的简单实例的matlab实现
  10. 易语言关于SEH异常处理