点击查看代码
#装饰器,对数据库操作不当时进行回滚
def with_session(f):
@wraps(f)
def wrapper(*args, **kwargs):
with session_scope() as session:
try:
result = f(session, *args, **kwargs)
session.commit()
return result
except:
session.rollback()
raise
return wrapper
具体解释如下:
-
装饰器作用:
这个装饰器用于包装那些需要操作数据库的函数,它会自动处理数据库会话(session)的创建、提交和回滚。 -
工作流程:
- 使用
with session_scope()
创建一个数据库会话(session
),with
语句确保会话会被正确关闭 - 调用被装饰的函数
f
,并将创建的session
作为第一个参数传入 - 如果函数执行成功(没有异常),就调用
session.commit()
提交所有数据库操作 - 如果执行过程中发生任何异常,就调用
session.rollback()
撤销所有操作,然后重新抛出异常
- 使用
-
优势:
- 避免手动编写会话管理代码,减少重复劳动
- 确保异常发生时数据库操作会正确回滚,保证数据一致性
- 使用
@wraps(f)
保留被装饰函数的元信息(如函数名、文档字符串等)
使用示例:
@with_session
def add_user(session, name, age):
user = User(name=name, age=age)
session.add(user)
return user.id
这样定义的add_user
函数会自动获得事务管理功能,无需手动处理会话的提交和回滚。