首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用原始sqlalchemy时删除每个请求的会话

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

Stack Overflow用户
提问于 2019-05-23 02:06:13
回答 1查看 202关注 0票数 0

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

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

代码语言:javascript
复制
from yourapplication.database import db_session

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

为什么我需要这样做?如果我不添加这段代码会发生什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-23 05:33:37

我不提供你为什么需要它的确切原因,让我来建议一个实际的原因。

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

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

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

。。可能还有更多的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56262607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档