使用原始sqlalchemy时,删除每个请求的会话

时间:2019-05-22 18:06:13

标签: flask sqlalchemy

由于某些原因,我必须在Flask应用程序中使用原始SqlAlchemy库。

当我读到这个link时,我遇到了这样一个问题:“要以声明性的方式在您的应用程序中使用SQLAlchemy,您只需将以下代码放入您的应用程序模块中即可。Flask会在以下位置自动删除数据库会话:请求结束或应用程序关闭时”。这是代码:

from yourapplication.database import db_session

@app.teardown_appcontext
def shutdown_session(exception=None):
    db_session.remove()

为什么我需要这样做?如果我不添加此代码会怎样?

1 个答案:

答案 0 :(得分:1)

在没有提供确定您为何需要它的明确原因的情况下,让我提出一个实际原因。

sessions的存在是为了在实际提交更改并永久保存更改之前协调对数据库的更改。当您执行session.commit()时,将尝试进行完整的更改。它将完全失败或完全成功。如果您没有在每个session之后清除request,则它将持续存在,并且可能发生以下某些情况:

1)您执行了一个错误请求,该请求使用导致中断的元素修改了会话,并使会话保持打开状态。您执行一个有效的新请求(在同一会话中)并尝试提交。由于第一个请求中的错误,它失败。您的应用程序没有被解耦并明智地分离成小的模块化组件。很难调试,因为您会在第二个请求中预期到错误。

2)您执行有效的请求并进行一些更改。也许执行刷新以在提交之前访问id。但是,该会话未提交。在将来的某个未指定时间,将在现有(打开)会话上发出另一个请求。由于与此同时进行了许多更改,现在它已经过时了。新的提交可能会失败,并且再次难以调试。

..可能还有更多原因。