设计一个能描述"图书"与"作者"的关系的表结构,主要是用来体现多对多在SQLAlchemy的使用方法,需求是一本书可以有好几个作者和一个作者可以写好基本书。这时候我们需要设计一张中间表book_m2m_author来实现关联。
设计表:
# orm_m2m.py
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 Base = declarative_base() # 第三张表 会自动创建 又orm自动维护 book_m2m_author = Table("book_m2m_author",Base.metadata, Column("book_id",Integer,ForeignKey("books.id")), Column("author_id",Integer,ForeignKey("authors.id")),) # 创建图书表 class Book(Base): __tablename__="books" id = Column(Integer,primary_key=True) name = Column(String(64)) pub_date = Column(DATE) # 由于book不知道第三张表,所以要关联一下第三张表 author = relationship("Author",secondary=book_m2m_author,backref="books") def __repr__(self): return self.name # 创建作者表 class Author(Base): __tablename__="authors" id = Column(Integer,primary_key=True) name = Column(String(32)) def __repr__(self): return self.name # 指定连接编码,解决中文问题 charset=utf8 engine = create_engine("mysql+pymysql://root:@localhost/test?charset=utf8",encoding="utf-8",echo=True) Base.metadata.create_all(engine) # 创建表结构
向设计好的表中添加数据之后,执行查询和删除操作
import orm_m2m from sqlalchemy.orm import sessionmaker # 添加数据 # 创建会话 Session_class = sessionmaker(bind=orm_m2m.engine) # 生成实例 session = Session_class() '''创建开始''' # 创建书 # b1 = orm_m2m.Book(name="Python",pub_date="2016-02-10") # b2 = orm_m2m.Book(name="SQLAlchemy",pub_date="2017-02-13") # b3 = orm_m2m.Book(name="demo",pub_date="2017-03-31") # # # 创建作者 # a1 = orm_m2m.Author(name="Jack") # a2 = orm_m2m.Author(name="zzzeek") # a3 = orm_m2m.Author(name="vinta") # # # 关联关系 # b1.author = [a1,a3] # b3.author = [a1,a2,a3] # # # 全部添加 # session.add_all([b1,b2,b3,a1,a2,a3]) # session.commit() '''创建结束''' '''查询开始''' author_obj = session.query(orm_m2m.Author).filter(orm_m2m.Author.name=="Jack").first() print(author_obj.books[0:]) book_obj = session.query(orm_m2m.Book).filter(orm_m2m.Book.id == 5).first() print(book_obj.author) '''查询结束''' '''删除开始''' # 通过书删除作者 author_obj = session.query(orm_m2m.Author).filter(orm_m2m.Author.name=="Jack").first() # book_obj = session.query(orm_m2m.Book).filter(orm_m2m.Book.name=="demo").first() # # 从一本书删除一个作者 # book_obj.author.remove(author_obj) session.delete(author_obj.name,author_obj.books) # 直接删除 session.commit() '''删除结束'''
更多案例可查询:https://github.com/zzzeek/sqlalchemy
浙公网安备 33010602011771号