9.3 数据库模型定义与关系
FastAPI数据库模型定义与关系完整教程 | 新手入门指南
本教程详细讲解如何在FastAPI中定义数据库模型和处理关系。涵盖使用SQLAlchemy定义模型、理解一对一、一对多和多对多关系,并提供简单易懂的代码示例,帮助初学者快速上手FastAPI数据库操作。
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的表,包含id、username和email字段。primary_key=True表示主键,index=True提高查询效率。
数据库关系
数据库关系定义了表之间的连接,常见类型包括:
- 一对一(One-to-One):例如,一个用户对应一个个人资料。
- 一对多(One-to-Many):例如,一个用户可以发布多篇帖子。
- 多对多(Many-to-Many):例如,一个用户可以加入多个群组,一个群组可以有多个用户。
定义关系
在SQLAlchemy中,使用relationship和ForeignKey来定义关系。以下是一对多关系的示例:
首先,扩展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的优势。
- 探索异步数据库操作,如使用
async和await与SQLAlchemy。 - 实践更复杂的关系,如多对多关系,通常需要连接表。
本教程旨在帮助你入门FastAPI数据库操作。通过动手实践,你将能够轻松处理各种数据场景。如有问题,请参考官方文档或社区资源。