Python sqlalchemy orm 多对多外键关联
多对多外键关联
注:使用三张表进行对应关联
实现代码:
# 创建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下的id
Column('book_id',Integer,ForeignKey('books.id')), # 创建外键 关联authors下的id
Column('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' 反查Book
authors = 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()
Python sqlalchemy orm 多对多外键关联的更多相关文章
- Python SQLAlchemy多对多外键关联时表结构
# 创建多对多表结构 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.engine import cre ...
- Python sqlalchemy orm 外键关联
创建外键关联 并通过relationship 互相调用 如图: 实现代码: import sqlalchemy # 调用链接数据库 from sqlalchemy import create_engi ...
- Python sqlalchemy orm 多外键关联
多外键关联 注:在两个表之间进行多外键链接 如图: 案例: # 创建两张表并添加外键主键 # 调用Column创建字段 加类型 from sqlalchemy import Integer, For ...
- pythonのsqlalchemy外键关联查询
#!/usr/bin/env python import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.dec ...
- 【Python】django模型models的外键关联使用
Python 2.7.10,django 1.8.6 外键关联:http://www.bubuko.com/infodetail-618303.html 字段属性:http://www.cnblogs ...
- Hibernate,关系映射的多对一单向关联、多对一双向关联、一对一主键关联、一对一外键关联、多对多关系关联
2018-11-10 22:27:02开始写 下图内容ORM.Hibernate介绍.hibername.cfg.xml结构: 下图内容hibernate映射文件结构介绍 下图内容hibernate ...
- sqlalchemy多外键关联
一.前言 如果有张表A的多个字段关联另一张表B的一个字段,就如同一个客户表的账单地址和发货地址,同时关联地址表中的id字段. 二.事例 # -*- coding: UTF-8 -*- from sql ...
- sqlalchemy外键关联
一.创建两张表,并关联外键 导入ForenginKey模块 # -*- coding: UTF-8 -*- from sqlalchemy import create_engine from sqla ...
- 测试脚本配置、ORM必知必会13条、双下划线查询、一对多外键关系、多对多外键关系、多表查询
测试脚本配置 ''' 当你只是想测试django中的某一个文件内容 那么你可以不用书写前后端交互的形式而是直接写一个测试脚本即可 脚本代码无论是写在应用下的test.py还是单独开设py文件都可以 ' ...
随机推荐
- C++学习 —— 重新认识C++
我大概是从读研究生入学那天开始,想要学好C++的,学习C++几乎也成了我每个学期的计划之一.为什么会每个学期都想要学好C++呢?因为每次学习都失败了啊... 本月,我开始再Coursera上学习Het ...
- 有多个正整数存放在数组中,编写一个函数要求偶数在左边由小到大顺序放置,奇数在右边,也是由小到大顺序放置,Java实现
思路: * 1.首先分左右 * 2.分好再排序(左边和右边都单独排序) 第一步:分左右 可得注意了: 大体思路最先是从两头出发分成4种情况讨论(左or右,奇数or偶数)循环处理,出口是双层的嵌套循环( ...
- day14 十四、三元运算符,推导式,匿名内置函数
一.三元(目)运算符 1.就是if...else...语法糖 前提:if和else只有一条语句 # 原来的做法 cmd = input('cmd:>>>') if cmd.isdig ...
- mysql小细节随笔
1, MySQL decimal(x,y) 存入根据y的下一位四舍五入,查了半天以为是laravel模型做了预处理,结果发现不是,是mysql decimal类型数据自动处理的,有好,也不好,合并订 ...
- 一个完整的hadoop程序开发过程
目的 说明hadoop程序开发过程 前提条件 ubuntu或同类OS java1.6.0_45 eclipse-indigo hadoop-0.20.2 hadoop-0.20.2-eclipse-p ...
- java学习笔记-连数据库JDBC
查看JDK API文档,学习JDBC中类和接口的定义,分析其中的方法 ===============PreparedStatement ===================查询
- Java开发想尝试大数据和数据挖掘,如何规划学习?
大数据火了几年了,但是今年好像进入了全民大数据时代,本着对科学的钻(zhun)研(bei)精(tiao)神(cao),我在17年年初开始自学大数据,后经过系统全面学习,于这个月跳槽到现任公司. 现在已 ...
- 最全的MonkeyRunner自动化测试从入门到精通(6)
eclipse中进行插入PyDev插件的使用步骤一:monkeyrunner环境变量的配置.在Android Sdk中的tools目录下,拷贝路径,进行配置环境变量.与上面的配置方法一样,在这里不做过 ...
- Fiddler (进阶)内置命令与断点
Fiddler 内置命令与断点 命令 对应请求项 介绍 示例 ? All 问号后边跟一个字符串,可以匹配出包含这个字符串的请求 ?google > Body 大于号后面跟一个数字,可以匹配出请求 ...
- 拦截器、过滤器、@Aspect 区别
1.需求场景 之前也有在文章写道 “拦截器\过滤器" 的区别,文章链接,在实际开发过程中,我们可能会遇到拦截请求参数的需求,在这我举个场景. 某一个接口的请求参数都是加密的,而请求参中还有一 ...