FastAPI教程-集成SQLAlchemy:创建引擎、会话工厂、依赖函数get_db()、模型基类(database.py) 作者:马育民 • 2026-08-17 07:39 • 阅读:10000 # 介绍 在这个文件中,做以下操作: 1. 创建(异步)引擎 2. 创建(异步)会话工厂 # 创建引擎 ``` # 数据库链接 DB_URL = "mysql+aiomysql://root:root@127.0.0.1:3306/fastapi_std?charset=utf8mb4" # 创建引擎 async_engine = create_async_engine( DB_URL, echo=True, # True打印执行SQL,调试打开;生产关闭 pool_size=5, # 连接池大小 max_overflow=10, # 最大连接数量 ) ``` # 创建会话工厂 **作用:**通过会话工厂获取 `session` 对象 ``` # 创建异步会话工厂,通过该会话工厂,创建session async_session = async_sessionmaker( async_engine, # 绑定数据库引擎 class_=AsyncSession, # 指定会话类 expire_on_commit=False # 会话对象不过期,不重新查询数据库 ) ``` ### 例子 ``` async def test(): async with async_session() as session: session.... 执行增删改操作 ``` # 创建依赖函数 **作用:**给路由注入 `Depend` 依赖时,调用该函数 **好处:**在外部执行数据库操作时,不用写 `with` 语句 **原理:**通过 `yield` 抛出的生成器对象,在外部可以直接调用生成器对象,执行完再回到 `get_db()` 函数中,自动关闭 `session`。 ``` async def get_db(): async with async_session() as session: # 返回生成器对象,在Depend依赖中会自动获取session yield session # 退出async with会自动关闭session、归还连接,异常自动rollback ``` # 创建模型基类 **作用:**其他的模型类都继承这个类 **好处:**有 **共有字段**,都可以定义在该类中 ``` # 模型基类 class Base(DeclarativeBase): pass ``` # 完整代码 ``` from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker from sqlalchemy.orm import DeclarativeBase # 数据库链接 DB_URL = "mysql+aiomysql://root:root@127.0.0.1:3306/fastapi_std?charset=utf8mb4" # 创建引擎 async_engine = create_async_engine( DB_URL, echo=True, # True打印执行SQL,调试打开;生产关闭 pool_size=5, # 连接池大小 max_overflow=10, # 最大连接数量 ) # 创建异步会话工厂,通过该会话工厂,创建session async_session = async_sessionmaker( async_engine, # 绑定数据库引擎 class_=AsyncSession, # 指定会话类 expire_on_commit=False # 会话对象不过期,不重新查询数据库 ) # 依赖项,给路由注入db会话,好处:不用写with 语句 async def get_db(): async with async_session() as session: # 返回生成器对象,在Depend依赖中会自动获取session yield session # 退出async with会自动关闭session、归还连接,异常自动rollback # 模型基类 class Base(DeclarativeBase): pass ``` 原文出处:/show_1GW3sRlpvB0t.html