FastAPI 接口编写(main.py)

把数据库配置和模型串起来,提供 HTTP 接口。

一、完整代码

from fastapi import FastAPI, Depends
from sqlalchemy import select
from sqlalchemy.orm import Session
from database import SessionLocal, engine, Base
from models import User

# 启动时自动建表(开发阶段方便,生产环境用 Alembic 迁移)
Base.metadata.create_all(bind=engine)

app = FastAPI()


# ---------- 依赖注入:每个请求分配一个数据库会话 ----------
def get_db():
    db = SessionLocal()       # 打开会话
    try:
        yield db              # 把会话交给路由函数使用
    finally:
        db.close()            # 请求结束后关闭会话


# ---------- 创建用户 ----------
@app.post("/users/")
def create_user(name: str, email: str, db: Session = Depends(get_db)):
    user = User(name=name, email=email)
    db.add(user)       # 添加到会话
    db.commit()        # 提交事务,写入数据库
    db.refresh(user)   # 刷新,拿到数据库生成的 id
    return user


# ---------- 查询所有用户 ----------
@app.get("/users/")
def list_users(db: Session = Depends(get_db)):
    return db.execute(select(User)).scalars().all()


# ---------- 查询单个用户 ----------
@app.get("/users/{user_id}")
def get_user(user_id: int, db: Session = Depends(get_db)):
    return db.execute(select(User).where(User.id == user_id)).scalars().first()

二、逐块解释

1. create_all — 自动建表

Base.metadata.create_all(bind=engine)
  • 读取所有继承 Base 的 Model,自动创建对应的表
  • 如果表已存在则跳过,不会重复创建或覆盖
  • 开发阶段很方便,生产环境建议用 Alembic 做版本化迁移(第 05 节会讲)

2. get_db — 依赖注入

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

这是 FastAPI + SQLAlchemy 的标准写式,必须掌握:

  1. SessionLocal() — 打开一个数据库会话
  2. yield db — 把会话交给路由函数,路由函数里用 db 操作数据库
  3. finally: db.close() — 无论请求成功还是失败,都会关闭会话

路由函数通过 Depends(get_db) 使用它:

def list_users(db: Session = Depends(get_db)):
    #                     ↑ FastAPI 自动调用 get_db(),把 db 注入进来

3. 增删改查基本操作

from sqlalchemy import select

# 新增
user = User(name="张三", email="zhangsan@example.com")
db.add(user)        # 加入会话(还没写入数据库)
db.commit()         # 提交事务(真正写入)
db.refresh(user)    # 刷新,拿到数据库自动生成的 id

# 查询
db.execute(select(User)).scalars().all()                              # 查全部
db.execute(select(User).where(User.id == 1)).scalars().first()       # 按条件查一条
db.execute(select(User).where(User.name.contains("张"))).scalars().all()  # 模糊查询

# 修改
user.name = "李四"
db.commit()         # 直接 commit,SQLAlchemy 自动检测变更并生成 UPDATE

# 删除
db.delete(user)
db.commit()

三、运行

uvicorn main:app --reload

打开浏览器访问 http://127.0.0.1:8000/docs,可以看到 Swagger 文档,直接在页面上测试接口。