image

点击查看代码
#装饰器,对数据库操作不当时进行回滚
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
这段代码定义了一个名为`with_session`的装饰器,主要用于简化数据库操作并确保数据一致性,核心功能是在数据库操作出错时自动回滚。

具体解释如下:

  1. 装饰器作用
    这个装饰器用于包装那些需要操作数据库的函数,它会自动处理数据库会话(session)的创建、提交和回滚。

  2. 工作流程

    • 使用with session_scope()创建一个数据库会话(session),with语句确保会话会被正确关闭
    • 调用被装饰的函数f,并将创建的session作为第一个参数传入
    • 如果函数执行成功(没有异常),就调用session.commit()提交所有数据库操作
    • 如果执行过程中发生任何异常,就调用session.rollback()撤销所有操作,然后重新抛出异常
  3. 优势

    • 避免手动编写会话管理代码,减少重复劳动
    • 确保异常发生时数据库操作会正确回滚,保证数据一致性
    • 使用@wraps(f)保留被装饰函数的元信息(如函数名、文档字符串等)

使用示例:

@with_session
def add_user(session, name, age):
    user = User(name=name, age=age)
    session.add(user)
    return user.id

这样定义的add_user函数会自动获得事务管理功能,无需手动处理会话的提交和回滚。