介绍
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