create_async_engine 是起点,不是终点;必须严格匹配异步驱动与连接串协议、用 async with 管理 AsyncSession 生命周期、继承 DeclarativeBase 并使用 Mapped 定义模型、显式调用 commit/rollback 控制事务。

create_async_engine是起点,不是终点。用错驱动、漏关会话、混用同步写法,接口照样卡死。
确认数据库驱动是否真正异步
常见错误是装了 aiomysql 却用 mysql+pymysql:// 连接串,或反过来装 asyncmy 却配 mysql+aiomysql://。两者不兼容,启动时可能无报错,但首次查询直接抛 RuntimeError: This event loop is already running 或静默阻塞。
必须严格匹配:
-
mysql+aiomysql://→ 依赖aiomysql -
mysql+asyncmy://→ 依赖asyncmy -
postgresql+asyncpg://→ 依赖asyncpg
检查命令:pip list | grep -i "aiomysql\|asyncmy\|asyncpg";连接串中协议前缀必须与已安装驱动一致。
AsyncSession 必须用 async with 管理生命周期
这是最常被忽略的坑。直接写 session = AsyncSessionLocal() 然后 await session.execute(...),会导致连接永不归还池,跑几轮压测就 TimeoutError: QueuePool limit of size 10 overflow 20 reached。
正确姿势只有一种:
async def get_user(user_id: int, session: AsyncSession = Depends(get_db)):
result = await session.execute(select(User).where(User.id == user_id))
return result.scalar_one_or_none()
其中 get_db 必须是:
async def get_db():
async with AsyncSessionLocal() as session:
yield session
注意:yield 不可省略,async with 不可替换成 sessionmaker 直接调用。
模型定义必须用 DeclarativeBase + Mapped
SQLAlchemy 2.0 异步模式下,老式 Column() 配合 declarative_base() 虽然能跑,但 await session.merge() 或 await session.refresh() 会报 AttributeError: 'AsyncSession' object has no attribute 'merge' —— 实际是模型没继承对基类。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
务必使用:
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(50))
不要用 from sqlalchemy.ext.declarative import declarative_base,那是 1.x 时代的同步写法,和异步会话不完全兼容。
事务边界必须显式控制
FastAPI 默认每个请求一个 AsyncSession,但 commit() 和 rollback() 不会自动触发。你写 await session.add(user) 后不 await session.commit(),数据就只是暂存在会话里,请求结束即丢弃。
典型错误流程:
- POST 创建用户 →
add+flush(想取 ID)→ 但没commit - 紧接着 GET 查询 → 查不到,因为事务未提交
解决方案只有两个:
- 明确需要持久化:在业务函数末尾加
await session.commit() - 只想查或临时操作:用
session.begin_nested()做保存点,避免污染主事务
别指望依赖注入自动 commit —— 它只管开和关会话,不管你的业务逻辑要不要存。
异步不是加个 async/await 就完事。驱动、基类、会话管理、事务控制,四个环节任一错位,都会让 FastAPI 的异步能力归零。尤其 async with 和 Mapped 这两点,90% 的线上问题都出在这儿。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










