SQLAlchemy.schema中如何定义表之间的一对多关系
在SQLAlchemy中,通过定义表之间的外键关系,可以实现一对多关系。在SQLAlchemy中,使用 ForeignKey 和 relationship 两个关键字来定义表之间的关系。
首先,我们先定义两个表,一个是"学生"表,另一个是"课程"表。"学生"表存储学生的信息,包括学生的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"。id 和 name 属性分别为学生的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"。id 和 name 属性分别为课程的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()
以上代码中,我们创建了两个学生对象: student1 和 student2。然后,创建了三个课程对象: course1、course2 和 course3。通过设置 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在表之间定义一对多关系的方法。通过设置外键和关系属性,我们可以很方便地建立和查询表之间的关系。
