Python sqlalchemy orm 多对多外键关联
生活随笔
收集整理的這篇文章主要介紹了
Python sqlalchemy orm 多对多外键关联
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
多對(duì)多外鍵關(guān)聯(lián)
注:使用三張表進(jìn)行對(duì)應(yīng)關(guān)聯(lián)
?
實(shí)現(xiàn)代碼:
# 創(chuàng)建3個(gè)表 配置外鍵關(guān)聯(lián)
# 調(diào)用Column創(chuàng)建字段 加類型 from sqlalchemy import Table, Column, Integer,String,DATE, ForeignKey# 調(diào)用操作鏈接,反查 from sqlalchemy.orm import relationship# 調(diào)用基類Base from sqlalchemy.ext.declarative import declarative_base# 調(diào)用鏈接數(shù)據(jù)庫(kù) from sqlalchemy import create_engine# 會(huì)話 from sqlalchemy.orm import sessionmaker# 生成orm基類 Base = declarative_base()# 表3 # 表3做復(fù)合鍵,通過(guò)這種方式創(chuàng)建表 不需要對(duì)此表對(duì)應(yīng)orm映射操作。 # 注:表2,表1,本身不知道表3的存在。 book_m2m_author = Table('book_m2m_author', Base.metadata,# 創(chuàng)建外鍵 關(guān)聯(lián)books下的idColumn('book_id',Integer,ForeignKey('books.id')),# 創(chuàng)建外鍵 關(guān)聯(lián)authors下的idColumn('author_id',Integer,ForeignKey('authors.id')),)# 創(chuàng)建Book表2 class Book(Base):__tablename__ = 'books'# 創(chuàng)建id字段 設(shè)置主鍵id = Column(Integer,primary_key=True)# 創(chuàng)建name字段name = Column(String(64))# 創(chuàng)建日期字段pub_date = Column(DATE)# Book通過(guò)Author 鏈接訪問(wèn)Auther表# Book通過(guò)secondary=book_m2m_author 字段查看表3# Author通過(guò)backref='books' 反查Bookauthors = relationship('Author',secondary=book_m2m_author,backref='books')# 返回一個(gè)可以用來(lái)表示對(duì)象的可打印字符串def __repr__(self):return self.name# 創(chuàng)建Author表1 class Author(Base):__tablename__ = 'authors'# 創(chuàng)建id字段 設(shè)置主鍵id = Column(Integer, primary_key=True)# 創(chuàng)建name字段name = Column(String(32))# 返回一個(gè)可以用來(lái)表示對(duì)象的可打印字符串def __repr__(self):return self.name# encoding='utf-8' 鏈接字符集 ,echo=True 把所有信息打印出來(lái) engine = create_engine("mysql+pymysql://root:123456@192.168.1.100/xiang",encoding='utf-8',#echo=True )#---------------1.創(chuàng)建表-----------------# # 創(chuàng)建表結(jié)構(gòu) Base.metadata.create_all(engine) #---------------------------------------#?
#插入數(shù)據(jù)查看信息
from www import orm_m2m # 會(huì)話 from sqlalchemy.orm import sessionmaker# bind=engine 綁定engine socket實(shí)例 Session_class = orm_m2m.sessionmaker(bind=orm_m2m.engine)# 生成session實(shí)例,如同pymysql內(nèi)的cursor Session = Session_class()#---------------2.寫(xiě)入數(shù)據(jù)-----------------## Book添加書(shū)名與日期 數(shù)據(jù) # 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")# 通過(guò)authors外鍵 b1書(shū) 添加 a1,a3作者。 # b1.authors = [a1,a3] # b3.authors = [a1,a2,a3]# 寫(xiě)如數(shù)據(jù),寫(xiě)入順序是隨機(jī)的 # Session.add_all([b1,b2,b3,a1,a2,a3]) #---------------------------------------##---------------3.查詢數(shù)據(jù)-----------------## 取出author表中 對(duì)象 author_obj = Session.query(orm_m2m.Author).filter(orm_m2m.Author.name=="kevin").first()# 通過(guò)作者取書(shū)的名字,books反向查找 print(author_obj.books)# 取出book表中 對(duì)象 book_obj = Session.query(orm_m2m.Book).filter(orm_m2m.Book.id==2).first()# 查看book表內(nèi)對(duì)應(yīng)書(shū)名字段id,的作者名稱,authors查找 print(book_obj.authors)# 執(zhí)行事務(wù) 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 | +----+-------+ 數(shù)據(jù)庫(kù)測(cè)試?
?
多對(duì)多刪除
刪除數(shù)據(jù)時(shí)不用管boo_m2m_authors , sqlalchemy會(huì)自動(dòng)幫你把對(duì)應(yīng)的數(shù)據(jù)刪除
通過(guò)書(shū)刪除作者
author_obj =s.query(Author).filter_by(name="Jack").first()book_obj = s.query(Book).filter_by(name="書(shū)名").first()# 從一本書(shū)里刪除一個(gè)作者s.commit() book_obj.authors.remove(author_obj)
直接刪除作者
刪除作者時(shí),會(huì)把這個(gè)作者跟所有書(shū)的關(guān)聯(lián)關(guān)系數(shù)據(jù)也自動(dòng)刪除
author_obj =s.query(Author).filter_by(name="kevin").first()# print(author_obj.name , author_obj.books)s.delete(author_obj)s.commit()?
轉(zhuǎn)載于:https://www.cnblogs.com/xiangsikai/p/8329144.html
總結(jié)
以上是生活随笔為你收集整理的Python sqlalchemy orm 多对多外键关联的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PRISM ‘VS100COMNTOOL
- 下一篇: Centos 7 安装 PostgreS