FastAPI 快速开发指南:MySQL 数据库集成实践
2025.09.18 18:04浏览量:69简介:本文详解 FastAPI 框架下如何高效连接 MySQL 数据库,涵盖环境配置、依赖管理、连接池优化及安全实践,助力开发者快速构建高性能 Web API。
FastAPI 快速开发指南:MySQL 数据库集成实践
在现代化 Web 开发中,FastAPI 以其高性能、易用性和自动生成 API 文档的特性,成为构建 Web API 的热门选择。而 MySQL 作为成熟的开源关系型数据库,凭借其稳定性、事务支持和广泛的社区生态,成为后端数据存储的首选方案。本文将系统阐述如何在 FastAPI 项目中高效集成 MySQL 数据库,从基础配置到高级优化,为开发者提供完整的实践指南。
一、环境准备与依赖管理
1.1 项目初始化
FastAPI 项目通常基于 Python 3.7+ 环境,推荐使用虚拟环境隔离依赖。通过以下命令创建并激活虚拟环境:
python -m venv venvsource venv/bin/activate # Linux/macOSvenv\Scripts\activate # Windows
1.2 依赖安装
核心依赖包括 FastAPI、Uvicorn(ASGI 服务器)和 MySQL 连接驱动。推荐使用 pymysql 或 mysql-connector-python:
pip install fastapi uvicorn pymysql sqlalchemy # SQLAlchemy 用于 ORM
若需异步支持,可安装 asyncpg 或 aiomysql,但需注意 FastAPI 默认同步模型下直接使用 pymysql 更简单。
1.3 数据库配置
在项目根目录创建 .env 文件存储敏感信息(需添加到 .gitignore):
DB_HOST=localhostDB_PORT=3306DB_USER=rootDB_PASSWORD=your_passwordDB_NAME=fastapi_db
通过 python-dotenv 加载配置:
from dotenv import load_dotenvimport osload_dotenv()DB_CONFIG = {"host": os.getenv("DB_HOST"),"port": int(os.getenv("DB_PORT")),"user": os.getenv("DB_USER"),"password": os.getenv("DB_PASSWORD"),"database": os.getenv("DB_NAME")}
二、同步模式下的 MySQL 连接
2.1 直接连接(简单场景)
对于轻量级应用,可直接使用 pymysql 建立连接:
import pymysqlfrom fastapi import FastAPIapp = FastAPI()def get_db_connection():return pymysql.connect(host=DB_CONFIG["host"],port=DB_CONFIG["port"],user=DB_CONFIG["user"],password=DB_CONFIG["password"],database=DB_CONFIG["database"],cursorclass=pymysql.cursors.DictCursor)@app.get("/users")def get_users():conn = get_db_connection()try:with conn.cursor() as cursor:cursor.execute("SELECT * FROM users")return cursor.fetchall()finally:conn.close()
缺点:每次请求创建新连接,性能低下。
2.2 连接池优化
使用 DBUtils 或 SQLAlchemy 的连接池提升性能:
from dbutils.pooled_db import PooledDBpool = PooledDB(creator=pymysql,maxconnections=5,mincached=2,host=DB_CONFIG["host"],user=DB_CONFIG["user"],password=DB_CONFIG["password"],database=DB_CONFIG["database"])@app.get("/users")def get_users():conn = pool.connection()try:with conn.cursor() as cursor:cursor.execute("SELECT * FROM users")return cursor.fetchall()finally:conn.close() # 实际归还到连接池
三、异步模式下的 MySQL 集成
3.1 使用 aiomysql
FastAPI 原生支持异步,搭配 aiomysql 可实现非阻塞 I/O:
import aiomysqlfrom fastapi import FastAPI, Dependsfrom contextlib import asynccontextmanagerapp = FastAPI()@asynccontextmanagerasync def lifespan(app: FastAPI):# 初始化连接池pool = await aiomysql.create_pool(host=DB_CONFIG["host"],port=DB_CONFIG["port"],user=DB_CONFIG["user"],password=DB_CONFIG["password"],db=DB_CONFIG["database"],minsize=5,maxsize=10)async with pool:app.state.pool = poolyieldpool.close()await pool.wait_closed()app = FastAPI(lifespan=lifespan)async def get_db():return app.state.pool.acquire()@app.get("/users")async def get_users(db=Depends(get_db)):async with db as conn:async with conn.cursor() as cursor:await cursor.execute("SELECT * FROM users")return await cursor.fetchall()
3.2 使用 SQLAlchemy 2.0 异步 API
SQLAlchemy 2.0+ 原生支持异步:
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSessionfrom sqlalchemy.orm import sessionmakerfrom fastapi import FastAPI, DependsDATABASE_URL = f"mysql+aiomysql://{DB_CONFIG['user']}:{DB_CONFIG['password']}@{DB_CONFIG['host']}:{DB_CONFIG['port']}/{DB_CONFIG['database']}"engine = create_async_engine(DATABASE_URL, echo=True)AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)async def get_db():async with AsyncSessionLocal() as session:yield sessionapp = FastAPI()@app.get("/users")async def get_users(db: AsyncSession = Depends(get_db)):result = await db.execute("SELECT * FROM users")return result.scalars().all()
四、安全与最佳实践
4.1 防止 SQL 注入
始终使用参数化查询:
# 错误方式(易受注入攻击)query = f"SELECT * FROM users WHERE username = '{username}'"# 正确方式cursor.execute("SELECT * FROM users WHERE username = %s", (username,))
4.2 敏感数据保护
- 加密存储密码(使用
bcrypt或passlib) - 限制数据库用户权限(仅授予必要权限)
- 定期轮换数据库凭证
4.3 性能监控
五、完整项目示例
5.1 项目结构
fastapi_mysql/├── main.py # 入口文件├── models.py # 数据模型├── schemas.py # Pydantic 模型├── database.py # 数据库连接├── .env # 环境变量└── requirements.txt
5.2 核心代码
database.py:
from sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmakerfrom .config import settingsSQLALCHEMY_DATABASE_URL = f"mysql+pymysql://{settings.DB_USER}:{settings.DB_PASSWORD}@{settings.DB_HOST}:{settings.DB_PORT}/{settings.DB_NAME}"engine = create_engine(SQLALCHEMY_DATABASE_URL)SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)def get_db():db = SessionLocal()try:yield dbfinally:db.close()
main.py:
from fastapi import FastAPI, Dependsfrom sqlalchemy.orm import Sessionfrom .database import get_dbfrom .models import Userfrom .schemas import UserCreateapp = FastAPI()@app.post("/users/")def create_user(user: UserCreate, db: Session = Depends(get_db)):db_user = User(**user.dict())db.add(db_user)db.commit()db.refresh(db_user)return db_user@app.get("/users/{user_id}")def read_user(user_id: int, db: Session = Depends(get_db)):return db.query(User).filter(User.id == user_id).first()
六、部署建议
容器化部署:使用 Docker 封装应用与 MySQL 服务
FROM python:3.9-slimWORKDIR /appCOPY . .RUN pip install -r requirements.txtCMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
生产环境优化:
- 启用 Gzip 压缩
- 配置 HTTPS
- 使用连接池大小适配并发量
扩展方案:
- 读写分离(主从架构)
- 分库分表(如使用
Vitess)
总结
FastAPI 与 MySQL 的集成可灵活适配从简单 CRUD 到高并发场景的需求。开发者应根据项目规模选择同步/异步模式,合理配置连接池,并始终遵循安全最佳实践。通过 SQLAlchemy 等 ORM 工具,可进一步提升开发效率与代码可维护性。实际项目中,建议结合 CI/CD 流水线实现自动化测试与部署,确保系统稳定性。

发表评论
登录后可评论,请前往 登录 或 注册