您现在的位置是:首页>编程开发 网站首页编程开发

fastAPI+mySQL小规模项目结构

  • 三五
  • 编程开发
  • 2026-01-07
  • 90已阅读
简介 fastAPI+mySQL小规模项目结构

适合小规模项目、基于 FastAPI + MySQL清晰、可扩展但不复杂的项目结构,这是我在实际项目中比较常用的一种 👍

(适合:后台接口、管理系统、轻量业务服务)



一、推荐技术栈

  • FastAPI:Web 框架
  • MySQL:数据库
  • SQLAlchemy 2.x(推荐)或 1.4
  • Pydantic:数据校验
  • Uvicorn:ASGI 服务器
  • python-dotenv:环境变量


二、小规模项目目录结构(推荐)

project_name/
│
├── app/
│   ├── main.py               # FastAPI 入口
│   │
│   ├── core/                 # 核心配置
│   │   ├── config.py         # 配置(数据库、环境变量)
│   │   └── database.py       # 数据库连接
│   │
│   ├── models/               # SQLAlchemy ORM 模型
│   │   └── user.py
│   │
│   ├── schemas/              # Pydantic 模型
│   │   └── user.py
│   │
│   ├── crud/                 # 数据库操作(可选但推荐)
│   │   └── user.py
│   │
│   ├── api/                  # 路由
│   │   ├── deps.py           # 依赖(DB Session 等)
│   │   └── v1/
│   │       └── user.py
│   │
│   └── __init__.py
│
├── .env                      # 环境变量
├── requirements.txt
└── README.md

👉 这个结构的优点

  • 不复杂(小项目够用)
  • 后期可平滑扩展为中大型项目
  • 清晰分层:API / CRUD / Model / Schema

三、关键代码示例

1️⃣ 数据库配置(MySQL)

app/core/config.py

from pydantic import BaseSettings

class Settings(BaseSettings):
    DATABASE_URL: str

    class Config:
        env_file = ".env"

settings = Settings()

.env

DATABASE_URL=mysql+pymysql://user:[email protected]:3306/test_db

2️⃣ 数据库连接

app/core/database.py

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, DeclarativeBase
from app.core.config import settings

engine = create_engine(
    settings.DATABASE_URL,
    pool_pre_ping=True,
    echo=True
)

SessionLocal = sessionmaker(
    autocommit=False,
    autoflush=False,
    bind=engine
)

class Base(DeclarativeBase):
    pass

3️⃣ ORM 模型

app/models/user.py

from sqlalchemy import Integer, String
from sqlalchemy.orm import Mapped, mapped_column
from app.core.database import Base

class User(Base):
    __tablename__ = "users"

    id: Mapped[int] = mapped_column(Integer, primary_key=True)
    username: Mapped[str] = mapped_column(String(50), unique=True)
    email: Mapped[str] = mapped_column(String(100))

4️⃣ Pydantic Schema

app/schemas/user.py

from pydantic import BaseModel

class UserCreate(BaseModel):
    username: str
    email: str

class UserOut(BaseModel):
    id: int
    username: str
    email: str

    class Config:
        from_attributes = True

5️⃣ CRUD 操作

app/crud/user.py

from sqlalchemy.orm import Session
from app.models.user import User
from app.schemas.user import UserCreate

def create_user(db: Session, user: UserCreate):
    db_user = User(**user.model_dump())
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return db_user

6️⃣ 依赖注入(DB Session)

app/api/deps.py

from app.core.database import SessionLocal

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

7️⃣ 路由

app/api/v1/user.py

from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session

from app.api.deps import get_db
from app.schemas.user import UserCreate, UserOut
from app.crud.user import create_user

router = APIRouter(prefix="/users", tags=["users"])

@router.post("/", response_model=UserOut)
def create(user: UserCreate, db: Session = Depends(get_db)):
    return create_user(db, user)

8️⃣ FastAPI 入口

app/main.py

from fastapi import FastAPI
from app.api.v1.user import router as user_router

app = FastAPI(title="FastAPI MySQL Demo")

app.include_router(user_router)

四、启动方式

pip install -r requirements.txt
uvicorn app.main:app --reload

访问:

  • Swagger:http://127.0.0.1:8000/docs

五、适合的场景总结

非常适合小规模项目

✅ MySQL + FastAPI 主流组合

✅ 代码不臃肿

✅ 后期可扩展(加 auth、celery、redis 都不冲突)


上一篇:Django与FLASK的区别 详细对比

下一篇:

文章评论

Top