FastAPI教程-集成SQLAlchemy:创建引擎、会话工厂、依赖函数get_db()、模型基类(database.py)

介绍

在这个文件中,做以下操作:

  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,    # 指定会话类,调用 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

原文出处:/show_1GW3sRlpvB0t.html