欢迎访问宙启技术站
智能推送

SQLAlchemy.schema中如何定义表之间的一对多关系

发布时间:2023-12-17 17:25:00

在SQLAlchemy中,通过定义表之间的外键关系,可以实现一对多关系。在SQLAlchemy中,使用 ForeignKeyrelationship 两个关键字来定义表之间的关系。

首先,我们先定义两个表,一个是"学生"表,另一个是"课程"表。"学生"表存储学生的信息,包括学生的ID和姓名。"课程"表存储课程的信息,包括课程的ID和名称。在这个例子中,一个学生可以选修多门课程,而一门课程只能被一个学生选修。

首先,导入SQLAlchemy的模块和类:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

接下来,创建一个数据库连接并设置Base类:

engine = create_engine('sqlite:///example.db')
Base = declarative_base()

然后,定义"学生"表的类:

class Student(Base):
    __tablename__ = 'students'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    courses = relationship("Course", back_populates="student")

在这个类中,__tablename__ 属性定义了表名为 "students"。idname 属性分别为学生的ID和姓名。courses 属性使用 relationship 关键字定义了学生和课程之间的关系,并通过 back_populates 参数指定了在"课程"表中的引用属性。

接着,定义"课程"表的类:

class Course(Base):
    __tablename__ = 'courses'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    student_id = Column(Integer, ForeignKey('students.id'))
    student = relationship("Student", back_populates="courses")

在这个类中,__tablename__ 属性定义了表名为 "courses"。idname 属性分别为课程的ID和名称。student_id 属性定义了学生的外键,并通过 ForeignKey 关键字指定了外键的引用属性。student 属性使用 relationship 关键字定义了课程和学生之间的关系,并通过 back_populates 参数指定了在"学生"表中的引用属性。

最后,使用engine来创建数据库表:

Base.metadata.create_all(engine)

现在,我们就可以向这两个表中插入数据了:

from sqlalchemy.orm import sessionmaker

Session = sessionmaker(bind=engine)
session = Session()

student1 = Student(name="Tom")
student2 = Student(name="Mary")

course1 = Course(name="Math", student=student1)
course2 = Course(name="English", student=student1)
course3 = Course(name="History", student=student2)

session.add_all([student1, student2, course1, course2, course3])
session.commit()

以上代码中,我们创建了两个学生对象: student1student2。然后,创建了三个课程对象: course1course2course3。通过设置 student 属性来建立学生和课程之间的关系。最后,我们使用 session.add_all() 方法将所有的对象添加到会话中,并使用 session.commit() 方法提交事务。

现在,我们可以查询学生选修的课程:

courses = session.query(Course).join(Student).filter(Student.name == "Tom").all()

for course in courses:
    print(course.name)

以上代码中,我们使用 query() 方法和 join() 方法来查询学生选修的课程。通过 filter() 方法来指定查询条件。最后,我们通过遍历查询结果并打印出课程的名称。

这就是使用SQLAlchemy在表之间定义一对多关系的方法。通过设置外键和关系属性,我们可以很方便地建立和查询表之间的关系。