Files

40 lines
2.5 KiB
Python
Raw Permalink Normal View History

# 从 sqlalchemy 库导入 create_engine,用于创建数据库连接引擎
from sqlalchemy import Column, Integer, String, ForeignKey, Table,Date
from sqlalchemy.orm import relationship
from database import Base
#=============== 多对多中间表1:老师 ↔ 班级 ===============
teacher_class = Table(
"teacher_class", # 中间表名
Base.metadata, # 绑定到 Base 的元数据
#两个外键,共同组成联合主键,防止重复绑定同一个老师班级
Column("tid",Integer,ForeignKey("teacher.tid"),primary_key=True), # 老师ID,外键指向老师表,同时是组合主键的一部分
Column("cid",Integer,ForeignKey("classes.cid"),primary_key=True), # 班级ID,外键指向班级表,同时是组合主键的一部分
)
#=============== 多对多中间表2: 老师 ↔ 学生 ===============
teacher_student = Table(
"teacher_student", # 中间表名
Base.metadata, # 绑定到 Base 的元数据
#两个外键,共同组成联合主键,防止重复绑定同一个老师学生
Column("tid",Integer,ForeignKey("teacher.tid"),primary_key=True),# 老师ID,外键指向老师表,同时是组合主键的一部分
Column("sid",Integer,ForeignKey("student.sid"),primary_key=True),# 学生ID,外键指向学生表,同时是组合主键的一部分
)
#=============== 老师主表 ===============
class Teacher(Base):
__tablename__ = "teacher" #数据库中对应表名
tid = Column(Integer, primary_key=True, autoincrement=True) #主键:老师编号,自增。
t_name = Column(String(20), nullable=False) #老师名字,非空,最大20个字符
phone = Column(String(11), unique=True) #手机号,唯一
subject = Column(String(20)) #授课科目,默认值为“班主任”
entry_time = Column(Date) #入职时间
is_deleted = Column(Integer, default=1) #逻辑删除,0=已删除,1=未删除
#=============== 关联关系定义 ==========
# secondary=中间表:指定通过哪张中间表关联
# back_populates:反向关联,和Class表中的teachers对应,实现双向查询
# 多对多:一个老师对应多个班级
classes = relationship("Classes", secondary=teacher_class, back_populates="teachers")
# 多对多:一个老师对应多个学生
students = relationship("Student", secondary=teacher_student, back_populates="teachers")