1. 程式人生 > >sqlalchemy操作----多表關聯

sqlalchemy操作----多表關聯

ref ger rep obj metadata odi second add elf

有二張表,一張作者表,一張書表,一個作者寫多本書,一本書可以由多個作者寫,與是通過新加一張關系表把他們聯系起來

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author aliex-hrg

from sqlalchemy import Table, Column, Integer,String,DATE, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine("mysql+pymysql://hrg:[email protected]:3306/test?charset=utf8")
Base = declarative_base()  #生成orm基類

Base = declarative_base()
book_to_author = Table(‘book_to_author‘, Base.metadata,
                        Column(‘book_id‘,Integer,ForeignKey(‘books.id‘)),
                        Column(‘author_id‘,Integer,ForeignKey(‘authors.id‘)),
                        )

class Author(Base):
    __tablename__ = ‘authors‘ #表名
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    def __repr__(self):
        return self.name

class Book(Base):
    __tablename__ = ‘books‘ #表名
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    authors = relationship(‘Author‘, secondary=book_to_author, backref=‘books‘)
    def __repr__(self):
        return self.name

Base.metadata.create_all(engine)  #創建表

a1 = Author(name=‘alex‘)
a2 = Author(name=‘keke‘)
a3 = Author(name=‘tom‘)
b1 = Book(name=‘linux‘)
b2 = Book(name=‘python‘)
b3 = Book(name=‘C++‘)

b1.authors = [a1,a2,a3]
b2.authors = [a1,a3]
b3.authors = [a3]

Session_class = sessionmaker(bind=engine)
Session = Session_class()

Session.add_all([a1,a2,a3,b1,b2,b3])
Session.commit()
print(‘--------通過書表查關聯的作者---------‘)
book_obj = Session.query(Book).filter(Book.name==‘linux‘).first()
print(book_obj.name,book_obj.authors)
print(‘--------通過作者表查關聯的書---------‘)
author_obj = Session.query(Author).filter(Author.name==‘alex‘).first()
print(author_obj.name,author_obj.books)
Session.commit()

#通過書刪除作者  只會從book_to_author表中刪除記錄
sobj = Session.query(Author).filter(Author.name==‘alex‘).first() #找出要刪除作者alex的對象名
bobj = Session.query(Book).filter(Book.name==‘linux‘).first()   #找出從linux這本書中刪除
bobj.authors.remove(sobj)
Session.commit()

#直接刪除作者   會從authors,book_to_author中刪除
#刪除作者時,會把這個作者跟所有書的關聯關系數據也自動刪除
author_obj =Session.query(Author).filter_by(name="tom").first()
Session.delete(author_obj)
Session.commit()

  。。。。

sqlalchemy操作----多表關聯