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()

 

posted @ 2020-05-15 13:20  不会飞的鲨鱼  阅读(219)  评论(0编辑  收藏  举报