由于某些原因,我必须在Flask应用程序中使用原始SqlAlchemy库。
当我阅读这篇link时,我遇到了这样的情况:“要在你的应用程序中以声明式的方式使用SQLAlchemy,你只需要将以下代码放入你的应用程序模块中。Flask将在请求结束或应用程序关闭时自动删除数据库会话。”代码如下:
from yourapplication.database import db_session
@app.teardown_appcontext
def shutdown_session(exception=None):
db_session.remove()
为什么我需要这样做?如果我不添加这段代码会发生什么?
发布于 2019-05-23 05:33:37
我不提供你为什么需要它的确切原因,让我来建议一个实际的原因。
sessions
的存在是为了在实际提交和永久保存更改之前协调对数据库的更改。当您执行session.commit()
时,将尝试执行完整的更改集。它要么完全失败,要么完全成功。如果您没有在每次request
之后清除session
,则它将持续存在,并且可能会发生以下一些情况:
1)您执行了一个错误的请求,该请求使用导致中断的元素修改了会话,并使会话保持打开状态。您执行了一个有效的新请求(在同一会话中),并尝试提交。它会因为第一个请求中的错误而失败。您的应用程序没有被合理地解耦和分离成小的模块化组件。这很难调试,因为您期望在第二个请求中出现错误。
2)您执行了一个有效的请求并进行了一些更改。也许在提交之前会执行刷新来访问id。但是,会话并未提交。在未来某个未指定的时间,会对现有的(打开的)会话发出另一个请求。它现在已经过时了,因为在此期间发生了更多的变化。新的提交可能会失败,并且同样难以调试。
。。可能还有更多的原因。
https://stackoverflow.com/questions/56262607
复制相似问题