sqlalchemy session.close() 未关闭连接

2 投票
1 回答
4966 浏览
提问于 2025-04-18 15:20

为什么在执行了 session.close() 之后,session 还能输出用户对象呢?

__init__.py

 def get_db(request):
    maker = request.registry.dbmaker
    session = maker()

    def cleanup(request):
        if request.exception is not None:
            session.rollback()
        else:
            session.commit()
        session.close()

    request.add_finished_callback(cleanup)
    return session

view.py

@view_config(route_name='get_path', renderer='json')
def get_path(request):
    session = request.db
    session.query(User).all()   # outputs user objects
    session.close()
    session.query(User).all()   # outputs user objects

我甚至尝试了 session.bind.dispose()(应该会关闭所有连接)

1 个回答

3

当你运行 session.close() 时,它会释放它可能使用的所有资源,比如事务或连接。它并不会真正关闭会话,这样在你调用它之后,仍然可以执行其他查询...

根据 sqlalchemy 的文档

关闭

close() 方法会执行 expunge_all(),并释放任何事务或连接资源。当连接被返回到连接池时,事务状态也会被回滚。

所以在你调用 session.close() 之后,仍然可以运行查询。任何未提交的事务,如上所述,都会被回滚。

撰写回答