Python SQLALchemy框架 (3)

   通过逻辑字段进行增加:

from sqlalchemy.orm import scoped_session from sqlalchemy.orm import sessionmaker # 导入引擎,模型表等 from models import * # 通过Session绑定引擎和数据库建立关系 Session = sessionmaker(bind=engine) # 创建链接池,使用session即可为当前线程拿出一个链接对象。内部采用threading.local进行隔离 session = scoped_session(Session) session.add_all( [ Students(name="学生01", re_class=Classes(name="一年级一班")), # 自动填入fk_class Students(name="学生02", re_class=Classes(name="一年级二班")), ] ) # 提交 session.commit() # 关闭链接 session.close() 多对多

   多对多也使用relationship做逻辑多对多,不会在物理表中创建关系,但是可以通过该字段进行增删改查。

   使用relationship时,传入指定手动生成的第三张表,代表这是多对多关系:

#!/usr/bin/env python # -*- coding:utf-8 -*- from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship # 基础类 Base = declarative_base() # 创建引擎 engine = create_engine( "mysql+pymysql://root@127.0.0.1:3306/db1?charset=utf8", # "mysql+pymysql://root:123@127.0.0.1:3306/db1?charset=utf8", # 有密码时 max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) class Classes(Base): __tablename__ = "classes" id = Column(Integer, primary_key=True) name = Column(String(32), nullable=False) class Students(Base): __tablename__ = "students" id = Column(Integer, primary_key=True) name = Column(String(32), nullable=False) # 可选级联操作:CASCADE,DELETE、RESTRICT fk_class = Column(Integer, ForeignKey("classes.id", ondelete="CASCADE", onupdate="CASCADE")) # 逻辑关系字段:不会在真实物理表中创建字段,但是可以通过该逻辑字段进行增删改查 # backref:反向查询的名字 re_class = relationship("Classes", backref="students") class Teachers(Base): __tablename__ = "teachers" id = Column(Integer, primary_key=True) name = Column(String(32), nullable=False) # 逻辑字段M2M:指定第三张表,secondary参数为__tablename__,反向查询为teachers re_class = relationship("Classes", secondary="teachersm2mclasses", backref="teachers") class TeachersM2mClasses(Base): __tablename__ = "teachersm2mclasses" id = Column(Integer, primary_key=True) teacher_id = Column(Integer, ForeignKey("teachers.id")) class_id = Column(Integer, ForeignKey("classes.id")) __table_args__ = ( UniqueConstraint("teacher_id", "class_id"), # 创建联合唯一 可指定name给个别名 ) def create_tb(): """ 创建表 :return: """ Base.metadata.create_all(engine) def drop_tb(): """ 删除表 :return: """ Base.metadata.drop_all(engine) if __name__ == '__main__': drop_tb() create_tb()

   用一个列表,将班级的记录对象放进去,你可以用多种增加方式,使用逻辑字段添加或自己操纵第三张表:

from sqlalchemy.orm import scoped_session from sqlalchemy.orm import sessionmaker # 导入引擎,模型表等 from models import * # 通过Session绑定引擎和数据库建立关系 Session = sessionmaker(bind=engine) # 创建链接池,使用session即可为当前线程拿出一个链接对象。内部采用threading.local进行隔离 session = scoped_session(Session) session.add_all( [ Teachers(name="老师01",re_class=[ session.query(Classes).filter_by(id=1).first() ]), Teachers(name="老师02",re_class=[ session.query(Classes).filter_by(id=1).first() ]), Teachers(name="老师03",re_class=[ session.query(Classes).filter_by(id=2).first() ]), ] ) # 提交 session.commit() # 关闭链接 session.close() 组合查询

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyswgy.html