• 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()
    
  • 相关阅读:
    无法执行 FunctionImport“entitys.xx”,因为未将它映射到存储函数。EF
    图解TCP/IP→第2章基础知识
    50个查询系列-第二个查询
    50个查询系列-第一个查询
    50个查询系列-建表和插入数据
    027医疗项目-模块二:药品目录的导入导出-导入功能的Action的编写
    026医疗项目-模块二:药品目录的导入导出-导入功能的Service的编写
    025医疗项目-模块二:药品目录的导入导出-HSSF导入类的封装
    024医疗项目-模块二:药品目录的导入导出-HSSF导入类的学习
    023医疗项目-模块二:药品目录的导入导出-从数据库中查出数据用XSSF导出excel并存放在虚拟目录最后下载(包括调试)
  • 原文地址:https://www.cnblogs.com/xiangsikai/p/8329144.html
Copyright © 2020-2023  润新知