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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM