96SEO 2026-09-05 17:20 0
⚠️ 常见痛点汇总:

text
应用启动 → 读取 DATABASE_URL
→ 创建 Engine → 创建 SessionLocal
→ 可选:初始化表/填充数据
→ FastAPI Router 接收请求
→ Depends 注入数据库 Session
→ Service 调用业务规则
→ Repository / ORM 执行读写
→ commit 或 rollback
→ 请求结束后关闭 Session
FastAPI 本身只负责 HTTP 与依赖注入,真正与 MySQL 通信的是:
text
FastAPI → SQLAlchemy → PyMySQL → MySQL
text
FastAPI – 管理 HTTP。不涉及底层 DB
Depends / get_db – 为每个请求提供独立 DB 会话
Engine – 提供连接入口和连接池
Session – 管理一次业务操作里的查询/写/提交/回滚
ORM Model – 把 Python 类映射到 DB 表
PyMySQL – 与 MySQL 服务进行底层通信
MySQL – 真正存储和查询数据
bash
pip install "fastapi" sqlalchemy pymysql pydantic-settings alembic
| 包 | 功能 | 示例用途 |
|---|---|---|
| fastapi | Web 框架 | 路由 + 参数校验 + OpenAPI |
| pydantic-settings | 环境变量读取 | .env 加载 |
| alembic | 数据库迁移 | 正式环境必备 |
| pymysql | MySql 驱动 | SQLAlchemy 使用 |
| sqlalchemy | ORM & 数据库工具 | 建模 + 查询 + session 管理 |
dotenv
DATABASE_URL=mysql+pymysql://root:password@localhost:3306/todo_api?charset=utf8mb4
DATABASE_ECHO=false # 调试时改为 true 打印 SQL
DATABASE_AUTO_CREATE=false # 本地 demo 可以 true,正式项目 false 并使用 Alembic
APP_NAME=Todo API # 用于 OpenAPI 标题等地方显示
python from pydantic_settings import BaseSettings,SettingsConfigDict
class Settings: modelconfig = SettingsConfigDict( envfile=".env",envfileencoding='utf-8' )
app_name: str = "Todo API"
database_url: str # 必填项,无默认值则启动失败
database_echo: bool = False # 是否打印 SQL 日志,可调试时开启
database_auto_create: bool = False # 启动时自动建表,用于本地 Demo
settings = Settings
Engine 和 SessionLocalpython import logging
from sqlalchemy import create_engine
loghandler=logging.getLogger loghandler.setLevel # 控制 SQL 日志级别
engine=createengine( settings.databaseurl,echo=settings.databaseecho,poolpre_ping=True # 防止长时间空闲后被服务器断开导致异常错误 )
SessionLocal 工厂python from sqlalchemy.orm import sessionmaker
SessionLocal=sessionmaker( bind=engine,autoflush=False,autocommit=False。expireoncommit=False # 提交后对象字段仍可直接读取而不立即过期 )
class Base: """所有 ORM 模型共同继承此基类""" pass
python import datetime
from sqlalchemy import Integer,String,Integer,String,DateTime,func from sqlalchemy.orm import Mapped,mapped_column
basemodulepath="" from app.db.base import Base
class User: tablename='users'
id :Mapped=mapped_column)
username :Mapped=mapped_column,unique=True)
email :Mapped=mapped_column,unique=True)
status :Mapped=mapped_column)
created_at :Mapped=mapped_column(
DateTime,server_default=func.now,nullable=False
)
python from typing_extensions import Annotated from sqlmodel.sql.sqltypes imporselect from sqlmodel.sql.selectable imporselectable from sqlmodel.sql.expression imporwhere from sqlmodel.engine.row imporecord from sqlmodel.sql.dml impodml from sqlmodel.engine.result imporow from sqlmodel.engine.session imposession from ..models imporUser
@dataclass class UserRepository: @staticmethod def getbyid->User|None: return db.get @staticmethod def getbyusername->User|None: return db.scalar.where) @staticmethod def create->User: u=User db.add;return u
python from typing_extensions importrichard from ..repository imporUserRepository from ..models imporUser
@dataclass class UserService: @staticmethod def getuser->User|None: return UserRepository.getbyid @staticmethod def createuser->User: exists=UserRepository.getbyusername if exists is not None : raise ValueError try这方面,u=UserRepository.create db.commit;db.refresh,return u except Exception as exc: db.rollback;raise exc
python from collections abc imporGenerator from sqlalchemy orm imporSession from ..db.session impsession_local
def getdb->Generator: db=sessionlocal try的观点是,return db finally=db.close
python from typing imports Annotated from fastapi imports APIRouter,Depends,HTTPException,status from ..dependencies.database impget_db
From ..schemas Import UserCreate。UserRead From ..service Import UserService
router=APIRouter
GET 使用者详情
python
@router.get
def read_user(user_id:int,db :Annotated) :
usr=UserService.get_user
if usr is None :
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,detail=f"未找到 ID {user_id} 的使用者")
return usr.model_dump
POST 新建使用者
路由层只关注输入输出,不做任何数据库逻辑。
todo-api/
├── app/
│ ├── main.py <-- FastAPI 应用入口
│ ├── api/
│ │ └── v1/
│ │ └── router.py <-- 全局 API 路由挂载
│ ├── core/
│ │ └── config.py <-- 环境变量读取
│ ├── db/
│ │ ├── base.py <-- 基类
│ │ ├── models.py <-- 聚合所有模型导出
│ │ └── session.py <-- Engine + SessionLocal 初始化
│ ├── dependencies/
│ │ └── database.py <-- get_db 函数
│ └─ modules/
│ └─ users/
│ ├─ models.py <-- 用户模型
│ ├─ schemas.py <-- Pydantic 数据校验
│ ├─ repository.py <-- 数据访问层
│ ├─ service.py <-- 业务规则层
│ └─ router.py <-- 路由接口定义
├── migrations/
├── tests/
├── .env
└── pyproject.toml
主要原则:公共基础设施放 core。db,dependencies;每模块单独放置业务代码.
python asynccontextmanager asyncdef lifespan: init_database yield
app=FastAPI app.include_router
启动方式
使用 Uvicorn
uvicorn app.main:create_app --reload
或 使用命令行
uv run uvicorn app.main --reload
**
前端请求
POST /api/v1/users/content-type application/json
{ "username":"copyer","email":""}
服务端执行顺序
1️⃣ main ➜ apirouter ➜ usersrouter ➜ route.create_user
- 调用 get_db 获取一个新的 Session.
2️⃣ route ➜ service.create_user - 检查使用者名是否已存在。
3️⃣ service ➜ repository.create - 实体对象加入会话但未提交。
4️⃣ service ➜ commit - 写操作生成 INSERT 并返回自增 ID。
5️⃣ service ➜ refresh - 刷新实体得到默认字段值。
6️⃣ route ➜ 返回 JSON 响应
7️⃣ get_db finally 块
- db.close 把会话返回连接池。
若中途出现异常:
db.rollback。finally 块关闭会话。当前示例采用同步版:
Engine ← PyMySQl ← Sync Query
如果你想完全异步,需要替换为:
create_async_engine ← asyncmy / aiomysql ← AsyncSession
但要注意不要混用同步与异步对象;先把同步实现完全搭好,再决定是否升级异步。
❌ 写了 db.add 后没有任何动作;数据永远不会落库,
✅ 必须执行 db.commit 而且想获取自增 ID 时再做一次 db.refresh。
❌ 写操作失败后继续使用同一 session 会报错。
✅ 在捕获异常块里执行 db.rollback。
❌ 在路由函数里直接调用 create_engine。
✅ 应在应用启动阶段统一创建一次 engine 并复用连接池;只在每个请求里打开/关闭 session。
❌ 将 Connection URL 写死在 .py 文件中。
✅ 用 .env 或 CI/CD 的 Secrets 管理器来传递敏感信息,并保证 .env 不推送至 GitHub。
❌ 调用了 Base.metadata.create_all 却没有任何表生成。
✅ 确保所有模型类都已被导入,例如通过统一文件:
python
import yourmodulewithmodelshere all= 并在启动脚本里显式导入该文件以触发注册。
以上即为从零搭建一个可维护且健壮的 FastAPI‑MySql 项目的操作参考,包括主要设计思想和关键细节。如有更深入需求,可进一步 异步支持或集成 Alembic 数据迁移等功能。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback