多對多外鍵關聯python
注:使用三張表進行對應關聯mysql
實現代碼:sql
# 建立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) #---------------------------------------#
#插入數據查看信息session
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會自動幫你把對應的數據刪除socket
經過書刪除做者ide
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)
直接刪除做者 測試
刪除做者時,會把這個做者跟全部書的關聯關係數據也自動刪除spa
author_obj =s.query(Author).filter_by(name="kevin").first() # print(author_obj.name , author_obj.books) s.delete(author_obj) s.commit()