引言
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,由 Python 3.6+ 支持。它具有异步支持,并且与 Starlette 和 Pydantic 集成。在本文中,我们将深入探讨如何使用 FastAPI 与数据库进行高效交互,并通过实战示例来解析这一过程。
FastAPI 简介
在开始之前,让我们先快速了解 FastAPI 的基本概念和特性:
- 异步支持:FastAPI 是异步的,这意味着它可以同时处理多个请求,从而提高性能。
- 自动文档:FastAPI 会自动生成交互式 API 文档。
- 类型安全:FastAPI 使用 Pydantic 来验证请求和响应数据。
- 易于扩展:FastAPI 提供了丰富的中间件和扩展点。
数据库交互基础
在 FastAPI 中,与数据库交互通常涉及以下步骤:
- 选择数据库和相应的 ORM(对象关系映射)库。
- 创建数据库模型(通常使用 Pydantic)。
- 创建数据库实例。
- 定义路由和操作来处理数据库操作。
选择数据库和 ORM
FastAPI 支持多种数据库和 ORM,以下是一些流行的选择:
- SQLAlchemy:用于关系型数据库,如 PostgreSQL、MySQL 和 SQLite。
- Gino:用于 SQLAlchemy,专门为异步设计。
- Tortoise ORM:用于 SQLAlchemy,支持异步操作。
创建数据库模型
以下是一个使用 Pydantic 创建数据库模型的示例:
from pydantic import BaseModel
class User(BaseModel):
id: int
name: str
age: int
创建数据库实例
以下是一个使用 SQLAlchemy 创建数据库实例的示例:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
定义路由和操作
以下是一个使用 FastAPI 定义路由和操作的示例:
from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
app = FastAPI()
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.post("/users/")
def create_user(user: User, db: Session = Depends(get_db)):
db_user = User(id=user.id, name=user.name, age=user.age)
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user
实战示例:用户管理 API
在这个实战示例中,我们将创建一个简单的用户管理 API,包括创建、读取、更新和删除用户。
创建用户
@app.post("/users/")
def create_user(user: User, db: Session = Depends(get_db)):
db_user = User(id=user.id, name=user.name, age=user.age)
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user
获取用户列表
@app.get("/users/")
def read_users(db: Session = Depends(get_db)):
return db.query(User).all()
更新用户
@app.put("/users/{user_id}")
def update_user(user_id: int, user: User, db: Session = Depends(get_db)):
db_user = db.query(User).filter(User.id == user_id).first()
if not db_user:
raise HTTPException(status_code=404, detail="User not found")
db_user.name = user.name
db_user.age = user.age
db.commit()
db.refresh(db_user)
return db_user
删除用户
@app.delete("/users/{user_id}")
def delete_user(user_id: int, db: Session = Depends(get_db)):
db_user = db.query(User).filter(User.id == user_id).first()
if not db_user:
raise HTTPException(status_code=404, detail="User not found")
db.delete(db_user)
db.commit()
return {"detail": "User deleted"}
总结
通过本文,我们了解了如何使用 FastAPI 与数据库进行高效交互。我们通过创建一个用户管理 API 的实战示例,展示了如何定义数据库模型、创建数据库实例、定义路由和操作,以及如何处理异步数据库操作。
希望本文能帮助您解锁 FastAPI 数据库交互的潜力,并在实际项目中应用这些知识。
