SQLAlchemy表关系
1.modules.py
from sqlalchemy import Table from sqlalchemy.orm import relationship from day05.connect import Base from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey ''' 一对一:学生表和学生详情表 本质上是双向关系,双方都有标量属性 需要学生表中设置uselist为False,将一对多转换为一对一 一对多:学院表和学生表 将一个外键放在引用父表(学院表)的子表(学生表)上。 relationship()然后在父项上指定, 多对多:学生表和课程表 要创建一个多对多的关系表,首先需要一个中间表,通过Table来创建一个中间表 ''' # 中间表 要创建一个多对多的关系表,首先需要一个中间表,通过Table来创建一个中间表 selects = Table('selects', Base.metadata, Column('student_id', Integer, ForeignKey('student.id')), Column('course_id', Integer, ForeignKey('course.id')) ) # 学生表 class Student(Base): # 提交到数据库 __tablename__ = 'student' # 表格名字 id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(20), nullable=False) college_id = Column(Integer, ForeignKey('college.id')) # 声明表关系 只要在Student表中的details字段上添加uselist=False就可以达到一对一的效果 details = relationship('Details', uselist=False, back_populates='student') # 学生详情表 class Details(Base): # 提交到数据库 __tablename__ = 'details' # 表格名字 id = Column(Integer, primary_key=True, autoincrement=True) age = Column(Integer, default=18) student_id = Column(Integer, ForeignKey('student.id')) student = relationship('Student', back_populates='details') # 声明表关系 # 学院表 class College(Base): __tablename__ = 'college' # 表格名字 id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(20), nullable=False) student = relationship('Student') # 课程表 class Course(Base): __tablename__ = 'course' # 表格名字 id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(20), nullable=False) student = relationship("Student", secondary=selects) # 最后再执行创建: if __name__=='__main__': Base.metadata.create_all()
2.添加数据
from modules import Student, Details, Course, College, selects from connect import session # 添加数据 def add_user(): # 添加数据到学院表 session.add_all([ College(name='清华大学'), College(name='北京大学'), College(name='浙江大学'), ]) # 添加数据到学生表 session.add_all([ Student(name='小花', college_id=1), Student(name='小红', college_id=2), Student(name='小黑', college_id=3), Student(name='小明', college_id=3), ]) # 添加数据到学生详情表 session.add_all([ Details(age=19, student_id=1), Details(age=16, student_id=2), Details(age=20, student_id=3), Details(age=21, student_id=4), ]) # 添加数据到课程表 session.add_all([ Course(name='Python'), Course(name='C++'), Course(name='Java'), ]) # 添加数据到中间表(一)已经存在的数据进行关联 c1 = session.query(Course).get(1) # 清华大学 s1 = session.query(Student).get(1) # 小花 c1.student.append(s1) # 添加数据到中间表(二)添加数据的时候进行关联 s1 = Student(name='小李', college_id=2) c1 = Course(name='PHP') c1.student.append(s1) session.add(c1) session.commit() if __name__=='__main__': # 验证 add_user()