Python sqlalchemy orm 多对多外键关联
生活随笔
收集整理的这篇文章主要介绍了
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下的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 多对多外键关联的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: PRISM ‘VS100COMNTOOL
- 下一篇: 20170513 Python练习册00