多对多外键关联

注:使用三张表进行对应关联

实现代码:

# 创建3个表 配置外键关联

# 调用Column创建字段 加类型
from sqlalchemy import Table, Column, Integer,String,DATE, ForeignKey# 调用操作链接,反查
from sqlalchemy.orm import relationship# 调用基类Base
from sqlalchemy.ext.declarative import declarative_base# 调用链接数据库
from sqlalchemy import create_engine# 会话
from sqlalchemy.orm import sessionmaker# 生成orm基类
Base = declarative_base()# 表3
# 表3做复合键,通过这种方式创建表 不需要对此表对应orm映射操作。
# 注:表2,表1,本身不知道表3的存在。
book_m2m_author = Table('book_m2m_author', Base.metadata,# 创建外键 关联books下的idColumn('book_id',Integer,ForeignKey('books.id')),# 创建外键 关联authors下的idColumn('author_id',Integer,ForeignKey('authors.id')),)# 创建Book表2
class Book(Base):__tablename__ = 'books'# 创建id字段 设置主键id = Column(Integer,primary_key=True)# 创建name字段name = Column(String(64))# 创建日期字段pub_date = Column(DATE)# Book通过Author 链接访问Auther表# Book通过secondary=book_m2m_author 字段查看表3# Author通过backref='books' 反查Bookauthors = relationship('Author',secondary=book_m2m_author,backref='books')# 返回一个可以用来表示对象的可打印字符串def __repr__(self):return self.name# 创建Author表1
class Author(Base):__tablename__ = 'authors'# 创建id字段 设置主键id = Column(Integer, primary_key=True)# 创建name字段name = Column(String(32))# 返回一个可以用来表示对象的可打印字符串def __repr__(self):return self.name# encoding='utf-8' 链接字符集 ,echo=True 把所有信息打印出来
engine = create_engine("mysql+pymysql://root:123456@192.168.1.100/xiang",encoding='utf-8',#echo=True
                       )#---------------1.创建表-----------------#
# 创建表结构
Base.metadata.create_all(engine)
#---------------------------------------#

#插入数据查看信息

from www import orm_m2m
# 会话
from sqlalchemy.orm import sessionmaker# bind=engine 绑定engine socket实例
Session_class = orm_m2m.sessionmaker(bind=orm_m2m.engine)# 生成session实例,如同pymysql内的cursor
Session = Session_class()#---------------2.写入数据-----------------## Book添加书名与日期 数据
# b1 = orm_m2m.Book(name="learn python with kevin",pub_date="2018-05-01")
# b2 = orm_m2m.Book(name="learn zhangbillit whit kevin",pub_date="2018-05-02")
# b3 = orm_m2m.Book(name="Lear hook up girls with kevin",pub_date="2018-05-03")# Author 添加作者名
# a1 = orm_m2m.Author(name="kevin")
# a2 = orm_m2m.Author(name="Jack")
# a3 = orm_m2m.Author(name="Rain")# 通过authors外键 b1书 添加 a1,a3作者。
# b1.authors = [a1,a3]
# b3.authors = [a1,a2,a3]# 写如数据,写入顺序是随机的
# Session.add_all([b1,b2,b3,a1,a2,a3])
#---------------------------------------##---------------3.查询数据-----------------## 取出author表中 对象
author_obj = Session.query(orm_m2m.Author).filter(orm_m2m.Author.name=="kevin").first()# 通过作者取书的名字,books反向查找
print(author_obj.books)# 取出book表中 对象
book_obj = Session.query(orm_m2m.Book).filter(orm_m2m.Book.id==2).first()# 查看book表内对应书名字段id,的作者名称,authors查找
print(book_obj.authors)# 执行事务
Session.commit()

book_m2m_author
+---------+-----------+
| book_id | author_id |
+---------+-----------+
|       1 |         1 |
|       1 |         3 |
|       2 |         1 |
|       2 |         2 |
|       2 |         3 |
+---------+-----------+books
+----+-------------------------------+------------+
| id | name                          | pub_date   |
+----+-------------------------------+------------+
|  1 | learn python with kevin       | 2018-05-01 |
|  2 | Lear hook up girls with kevin | 2018-05-03 |
|  3 | learn zhangbillit whit kevin  | 2018-05-02 |
+----+-------------------------------+------------+authors
+----+-------+
| id | name  |
+----+-------+
|  1 | kevin |
|  2 | Jack  |
|  3 | Rain  |
+----+-------+

数据库测试

多对多删除

删除数据时不用管boo_m2m_authors , sqlalchemy会自动帮你把对应的数据删除

通过书删除作者

author_obj =s.query(Author).filter_by(name="Jack").first()book_obj = s.query(Book).filter_by(name="书名").first()# 从一本书里删除一个作者s.commit()
book_obj.authors.remove(author_obj)

  

直接删除作者 

删除作者时,会把这个作者跟所有书的关联关系数据也自动删除

author_obj =s.query(Author).filter_by(name="kevin").first()# print(author_obj.name , author_obj.books)s.delete(author_obj)s.commit()

转载于:https://www.cnblogs.com/xiangsikai/p/8329144.html

Python sqlalchemy orm 多对多外键关联相关推荐

  1. Python sqlalchemy orm 多外键关联

     多外键关联 注:在两个表之间进行多外键链接 如图: 案例: # 创建两张表并添加外键主键 # 调用Column创建字段 加类型 from sqlalchemy import Integer, For ...

  2. 【Python】django模型models的外键关联使用

    [Python]django模型models的外键关联使用 Python 2.7.10,django 1.8.6 外键关联:http://www.bubuko.com/infodetail-61830 ...

  3. Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联...

    2018-11-10  22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...

  4. JPA关系映射系列一:one-to-one外键关联

    2019独角兽企业重金招聘Python工程师标准>>> SpringDataJPA是Spring Data的一个子项目,通过提供基于JPA的Repository极大的减少了JPA作为 ...

  5. hibernate一对一主键唯一外键关联(一)

    1.新建工程项目hibernate_one2one_ufk_1,添加hibernate所需Jar包和数据库驱动Jar包. 2.编写工具类HibernateUtils.java和ExportDB.jav ...

  6. Spring Data JAP框架处理表关系的步骤(一对一外键关联

    Spring Data JAP框架处理表关系的步骤: 1)确定表和表之间的关系 2)对应表创建实体类 3)在实体类配置注解关联关系 4)测试 一对一表关系的实现方案(外键关联: 1 在Customer ...

  7. PostgreSQL — 外键关联操作

    目录 文章目录 目录 PostgreSQL 的外键关联 创建表时定义外键(References,参照) 修改原有表的外键约束 删除外键约束 参考文档 PostgreSQL 的外键关联 一个外键约束指定 ...

  8. MySQL — 外键关联操作

    目录 文章目录 目录 MySQL 的外键约束 创建表时定义外键(References,参照) 修改原有表的外键约束 删除外键约束 参考文档 MySQL 的外键约束 注意,MySQL 的 InnoDB ...

  9. hibernate---一对一单项外键关联

    常见的数据库设计有两种:主键关联,单项的外键关联. 下面是一对一单项外键关联: 代码: 后台生成的表: 配置powerdesigner连接数据库,可以查看数据表的关联: 一般在powerdesigne ...

最新文章

  1. (转)径向模糊效果shader
  2. mybatis mysql方言_MyBatis 方言支持 - Mysql to 华为高斯数据库(gaussdb)
  3. URL/URI/URN的认识
  4. 使用清华开源镜像安装tensorflow
  5. Redis命令:INCR key加1
  6. 给大家推荐认识一位中科院大佬!
  7. IO之 Properties类加载文件
  8. 微信H5支付(基于Java实现微信H5支付)
  9. 葡萄品质无损检测技术的研究进展
  10. CCF201403-5 任务调度(100分题解链接)
  11. 程序员双十一都该买点啥?
  12. 程序员面试宝典(第三版).pdf
  13. C语言:鸡兔同笼(随机输入头数和脚数)
  14. sqlserver排序规则介绍以及修改
  15. SpringBoot的幕后推手,五年Java开发者小米、阿里面经
  16. iOS11界面交互设计规范(iOS 11 Human Interface Guidelines)
  17. allow_url_include和allow_url_fopen 详解
  18. Java简单练手---输出当前时间的方法
  19. asyncio系列之sleep()实现
  20. JAVA入门学习 —方法使用

热门文章

  1. 小学奥数_7829神奇序列求和 python
  2. php实现身份证号码获取归属地地址的实列教程,含完整全国地区归属数据!
  3. python下载邮件附件_Python - 从电子邮件附件下载excel文件然后解析它
  4. sql 整改措施 注入_SQL注入入侵防范措施
  5. Python笔记-Can’t reconnect until invalid transaction is rolled back
  6. Flask笔记-使用Cookie及简单加密判断是否为登录用户
  7. Web笔记-session及cookie
  8. Linux断点方法,一种基于Linux问题断点的定位方法及系统与流程
  9. ibm z系列服务器 cpu,全球最快CPU 解析IBM大型机z196处理器
  10. spring电子书_不懂Spring就彻底放Java吧