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

Flask 使用原始sqlalchemy时删除每个请求的会话,flask,sqlalchemy,Flask,Sqlalchemy,我必须使用原始SqlAlchemy库和Flask应用程序,因为有些事情 当我读到这篇文章时,我遇到了这样一个问题:“要以声明的方式在应用程序中使用SQLAlchemy,只需将以下代码放入应用程序模块。Flask将在请求结束或应用程序关闭时自动删除数据库会话。”。代码如下: from yourapplication.database import db_session @app.teardown_appcontext def shutdown_session(exception=None):

我必须使用原始SqlAlchemy库和Flask应用程序,因为有些事情

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

from yourapplication.database import db_session

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


我为什么要这样做?如果不添加此代码,会发生什么情况?

如果不提供您需要它的确切原因,请让我提出一个实际原因

会话的存在是为了在实际提交更改并永久保存之前协调对数据库的更改。执行
session.commit()
时,将尝试进行一整套更改。它要么完全失败,要么完全成功。如果在每次
请求之后未清除
会话
,则该会话将持续,并且可能发生以下某些情况:

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

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

。。可能还有更多的原因