在使用 SQLAlchemy 的 Flask 应用程序中,是否可以将“session.rollback”永久放在应用程序的开头?

In a Flask application that is using SQLAlchemy, is it ok to permanently put `session.rollback` at the beginning of the app?

总的来说,我是 Flask 和 Web 开发的新手。我有一个使用 SQLAlchemy 的 Flask Web 应用程序,是否可以将 session.rollback 放在应用程序的开头以便 保持它 运行 即使在之后交易失败? 我的网站在我尝试删除一个 table 的记录后停止工作时出现问题。错误日志显示删除失败,因为另一个 table 中的条目仍然引用这些记录作为它们的外键。错误日志建议使用 session.rollback 来回滚此更改,因此我在绑定数据库并创建会话后将其放在我的应用程序的开头,并且我的网站正常运行。这给了我将那条线留在那里的提示。我的举动是否正确、安全且没问题?如果这在某种程度上危及我网站的功能或逻辑,谁能告诉我正确的做法是什么?

你不应该在开始时使用回滚,而是在数据库操作失败时使用。 该错误是由于数据库中的完整性条件造成的。您 table 中的某些行正被另一个 table 引用。因此,您必须先删除引用行。

我想说的是,根据定义,你是 cargo cult coding 并且应该首先尝试确定为什么你会发现这些错误,而不是仅仅因为你不知道的原因而包含一些代码'不懂。

您描述的问题是使用外键确保数据库中数据完整性的结果。通常 SQLAlchemy 会使所有依赖的外键无效,但由于我对您的设置一无所知,因此无法解释为什么不会。这可能是数据库之间的差异。

将回滚放在路由(或整个全局应用程序)的开头的一个大问题是您可能会回滚您不想回滚的数据。您还没有提供 MVCE 所以没有人可以真正帮助您调试问题。

在这种情况下进行货物崇拜编码是可以理解的,但这绝不是一个好的做法。要解决此问题,请调查 SQLAlchemy 中的 cascades。此外,启动您实际的 SQL 数据库接口并查看数据的结构,并在您的配置文件中设置 SQLALCHEMY_ECHO = 1 以查看实际发出的内容。

祝你好运!