介绍
在这个文件中,做以下操作:
- 创建(异步)引擎
- 创建(异步)会话工厂
创建引擎
# 数据库链接
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, # 指定会话类,调用 async_session() 返回的类型
expire_on_commit=False # commit后,会话中的对象不过期,不重新查询数据库
)
关于 expire_on_commit 参数详见 链接
例子
普通函数创建 session:
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