FastAPI 解析多对多关系
在本文中,我们将介绍如何使用 FastAPI、SQLAlchemy 和 Pydantic 处理多对多关系。多对多关系是指两个实体之间存在多个对应关系的情况。例如,一个学生可以参加多个课程,一个课程也可以有多个学生。
阅读更多:FastAPI 教程
准备工作
首先,我们需要安装 FastAPI 和相应的依赖库。可以使用以下命令进行安装:
pip install fastapi sqlalchemy uvicorn
我们还需要安装 Pydantic 库,用于定义数据模型:
pip install pydantic
创建数据库模型
使用 SQLAlchemy 可以很方便地创建数据库模型。在这个例子中,我们将创建两个实体:Student
(学生)和Course
(课程)。一个学生可以参加多个课程,一个课程也可以有多个学生。
下面是创建数据库模型的示例代码:
from sqlalchemy import Column, Integer, String, Table, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
student_course = Table(
'association',
Base.metadata,
Column('student_id', Integer, ForeignKey('students.id')),
Column('course_id', Integer, ForeignKey('courses.id'))
)
class Student(Base):
__tablename__ = 'students'
id = Column(Integer, primary_key=True, index=True)
name = Column(String)
courses = relationship('Course', secondary=student_course, back_populates='students')
class Course(Base):
__tablename__ = 'courses'
id = Column(Integer, primary_key=True, index=True)
name = Column(String)
students = relationship('Student', secondary=student_course, back_populates='courses')
上述代码中,我们定义了两个实体类 Student
和 Course
。通过 relationship
函数,我们定义了两个实体之间的关联关系。students
字段表示学生参加的课程,courses
字段表示课程的学生。secondary
参数指定了关联表的名称。
创建 API 路由
接下来,我们将使用 FastAPI 创建 API 路由。我们可以使用以下示例代码:
from fastapi import FastAPI, HTTPException
from sqlalchemy.orm import Session
from sqlalchemy import create_engine
from pydantic import BaseModel
app = FastAPI()
# 数据库连接字符串
database_url = "sqlite:///./test.db"
# 创建 SQLAlchemy 引擎
engine = create_engine(database_url)
# 创建数据库会话
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
class CourseCreate(BaseModel):
name: str
class StudentCreate(BaseModel):
name: str
courses: List[int]
@app.post("/students/")
def create_student(student: StudentCreate, db: Session = Depends(get_db)):
courses = db.query(Course).filter(Course.id.in_(student.courses)).all()
if not courses:
raise HTTPException(status_code=400, detail="Invalid course ids")
db_student = Student(name=student.name, courses=courses)
db.add(db_student)
db.commit()
db.refresh(db_student)
return db_student
@app.get("/students/{student_id}")
def get_student(student_id: int, db: Session = Depends(get_db)):
student = db.query(Student).filter(Student.id == student_id).first()
if not student:
raise HTTPException(status_code=404, detail="Student not found")
return student
上述代码中,我们首先定义了两个数据模型 CourseCreate
和 StudentCreate
。StudentCreate
包含学生的名称和参加的课程列表。
然后,我们使用 create_student
函数在数据库中创建学生。在这个函数中,我们首先查询数据库中是否存在指定的课程,如果不存在则抛出异常。然后,我们创建一个新的学生实例,并将其存储到数据库中。
最后,我们使用 get_student
函数获取指定 ID 的学生信息。如果学生不存在,则抛出异常。
运行应用程序
接下来,我们可以使用以下命令在本地运行应用程序:
uvicorn main:app --reload
测试 API 接口
现在,我们可以使用 API 客户端或浏览器来测试我们的 API 接口。以下是一些示例请求:
- 创建一个学生:
POST /students/
{
"name": "小明",
"courses": [1, 2]
}
- 获取学生信息:
GET /students/1
总结
通过本文的介绍,我们使用 FastAPI、SQLAlchemy 和 Pydantic 成功处理了多对多关系。我们学习了如何创建数据库模型和 API 路由,并演示了如何创建、获取学生的信息。
FastAPI 提供了强大的工具和框架,使我们能够快速构建高性能的 Web API。通过结合 SQLAlchemy 和 Pydantic,我们可以方便地处理复杂的数据库关系。FastAPI 的简洁易用使得开发人员能够更加专注于业务逻辑的开发。