FastAPI 教程

9.3 数据库模型定义与关系

FastAPI数据库模型定义与关系完整教程 | 新手入门指南

FastAPI 教程

本教程详细讲解如何在FastAPI中定义数据库模型和处理关系。涵盖使用SQLAlchemy定义模型、理解一对一、一对多和多对多关系,并提供简单易懂的代码示例,帮助初学者快速上手FastAPI数据库操作。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

FastAPI数据库模型定义与关系教程

引言

在FastAPI中,数据库模型是连接应用程序与数据库的桥梁。通过定义模型,你可以轻松地执行数据操作,如增删改查,并构建RESTful API。本教程将带你从零开始,学习如何定义数据库模型和处理关系。

什么是数据库模型?

数据库模型是数据结构的抽象表示,通常对应于数据库中的表。它定义了数据的字段(列)和类型,使代码更易于理解和维护。在FastAPI中,我们常用ORM(对象关系映射)工具如SQLAlchemy来定义模型。

定义数据库模型

我们将使用SQLAlchemy作为示例,因为它与FastAPI集成良好。首先,确保安装必要的库:

pip install fastapi sqlalchemy

然后,定义一个简单的用户模型。在Python文件中,导入相关模块:

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

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'  # 表名

    id = Column(Integer, primary_key=True, index=True)  # 主键,索引
    username = Column(String, unique=True, nullable=False)  # 用户名,唯一且非空
    email = Column(String, unique=True, nullable=False)  # 邮箱,唯一且非空

这个模型定义了一个名为users的表,包含idusernameemail字段。primary_key=True表示主键,index=True提高查询效率。

数据库关系

数据库关系定义了表之间的连接,常见类型包括:

  1. 一对一(One-to-One):例如,一个用户对应一个个人资料。
  2. 一对多(One-to-Many):例如,一个用户可以发布多篇帖子。
  3. 多对多(Many-to-Many):例如,一个用户可以加入多个群组,一个群组可以有多个用户。

定义关系

在SQLAlchemy中,使用relationshipForeignKey来定义关系。以下是一对多关系的示例:

首先,扩展User模型并添加帖子模型:

from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship

# 用户模型
class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True, index=True)
    username = Column(String, unique=True, nullable=False)
    email = Column(String, unique=True, nullable=False)
    
    posts = relationship("Post", back_populates="user")  # 定义关系,一个用户有多个帖子

# 帖子模型
class Post(Base):
    __tablename__ = 'posts'
    
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String, nullable=False)  # 帖子标题
    content = Column(String)  # 帖子内容
    user_id = Column(Integer, ForeignKey('users.id'))  # 外键,关联用户表
    
    user = relationship("User", back_populates="posts")  # 定义反向关系

在这个示例中,user_id是外键,指向users表的id字段。relationship定义了双向关系,便于在代码中访问关联数据。

在FastAPI中集成模型

FastAPI通常与Pydantic结合使用,以验证和序列化数据。首先,定义Pydantic模型(schemas):

from pydantic import BaseModel

# 用户创建模型
class UserCreate(BaseModel):
    username: str
    email: str

# 帖子创建模型
class PostCreate(BaseModel):
    title: str
    content: str
    user_id: int

# 响应模型
class User(BaseModel):
    id: int
    username: str
    email: str
    posts: list[Post] = []  # 可选,用于返回关联数据

    class Config:
        orm_mode = True  # 允许从ORM对象转换

然后,在FastAPI应用中集成数据库。创建数据库连接和API路由:

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from . import models, schemas  # 假设模型和schema在同一项目
from .database import SessionLocal, engine  # 假设database模块处理连接

# 创建数据库表
models.Base.metadata.create_all(bind=engine)

app = FastAPI()

# 依赖注入获取数据库会话
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post("/users/", response_model=schemas.User)
def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
    db_user = models.User(username=user.username, email=user.email)  # 创建ORM对象
    db.add(db_user)  # 添加到会话
    db.commit()  # 提交事务
    db.refresh(db_user)  # 刷新对象以获取数据库生成的ID
    return db_user  # 返回Pydantic模型

@app.get("/users/{user_id}/posts/")
def get_user_posts(user_id: int, db: Session = Depends(get_db)):
    user = db.query(models.User).filter(models.User.id == user_id).first()  # 查询用户
    if not user:
        raise HTTPException(status_code=404, detail="User not found")
    return user.posts  # 返回关联的帖子列表

完整示例总结

通过以上步骤,你可以构建一个基本的FastAPI应用来处理数据库模型和关系。关键点:

  • 使用SQLAlchemy定义模型和关系。
  • 使用Pydantic验证和序列化数据。
  • 在FastAPI路由中集成数据库操作。

进阶建议

  • 学习使用SQLModel作为替代ORM,它结合了SQLAlchemy和Pydantic的优势。
  • 探索异步数据库操作,如使用asyncawait与SQLAlchemy。
  • 实践更复杂的关系,如多对多关系,通常需要连接表。

本教程旨在帮助你入门FastAPI数据库操作。通过动手实践,你将能够轻松处理各种数据场景。如有问题,请参考官方文档或社区资源。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包