FastAPI 解析多对多关系

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

上述代码中,我们定义了两个实体类 StudentCourse。通过 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

上述代码中,我们首先定义了两个数据模型 CourseCreateStudentCreateStudentCreate 包含学生的名称和参加的课程列表。

然后,我们使用 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 的简洁易用使得开发人员能够更加专注于业务逻辑的开发。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程