SQLAlchemy教程:创建session

介绍

Session 会话:ORM的核心工作单元,充当程序和数据库的桥梁。所有对象的 新增、修改、删除 先提交到 session,最后统一提交事务到数据库,支持回滚。

创建 session 有两种方式:

  • 直接创建
  • 使用工厂写法

方式1:直接创建(不推荐)

async def save(user: User):
    # AsyncSession 使用上下文管理器,自动关闭会话
    async with AsyncSession(async_engine,expire_on_commit = False) as session:
        try:
            session.add(user)
            # 成功执行才提交事务
            await session.commit()
        except Exception as e:
            # 如果报错就回滚
            await session.rollback()
            raise e

缺点

需要在 with 语句里设置参数,如下:

with AsyncSession(async_engine,expire_on_commit = False)

在有多个函数中需要对数据库进行增删改查操作,就都需要设置参数,不统一

提示: 关于 expire_on_commit 参数详见 链接

实现方式2:工厂方法(推荐)

在 工厂方法 中统一设置参数,之后通过该工厂方法创建 session:

工厂方法

"""
创建异步会话工厂,通过该会话工厂,创建session
好处:参数统一在这里配置,如:expire_on_commit
"""
async_session = async_sessionmaker(
    async_engine,           # 绑定数据库引擎
    class_=AsyncSession,    # 指定会话类,调用 async_session() 返回的类型
    expire_on_commit=False  # commit后,会话中的模型对象不过期,访问对象的属性,不需重新查询数据库
)

提示: 关于 expire_on_commit 参数详见 链接

执行增删改查函数

只需要调用 async_session() 创建 session 即可,不用设置参数:

async def save(user: User):
    # AsyncSession 使用上下文管理器,自动关闭会话
    async with async_session() as session:
        try:
            session.add(user)
            # 成功执行才提交事务
            await session.commit()
        except Exception as e:
            # 如果报错就回滚
            await session.rollback()
            raise e