我是Flask和Web开发的新手。我有一个使用SQLAlchemy的Flask Web应用程序,是否可以将session.rollback
放在应用程序的开头,以便即使在事务失败后也能保持运行?在我尝试删除一个表的记录后,当我的网站停止工作时,我遇到了问题。错误日志显示删除失败是由于另一个表中的条目仍然将这些记录作为其外键引用。错误日志建议使用session.rollback
来回滚此更改,因此我在绑定数据库并创建会话和我的网站工作之后将其放在我的应用程序的开头。这给了我一条在那里留下那条线的暗示。我的行动是否正确,安全可靠?任何人都可以告诉我,如果这有点危及我的网站的功能或逻辑,那么正确的做法是什么?
我要说你是按照定义cargo cult coding,并应该尝试确定为什么你首先发现这些错误,而不是仅仅因为你不理解的原因包含一些代码。
您描述的问题是使用外键来确保数据库中数据完整性的结果。通常SQLAlchemy将取消所有依赖外键,但由于我对你的设置一无所知,我无法解释为什么它不是。这可能是数据库之间的差异。
将回滚放在路径开头(或整个全局应用程序)的一个大问题是您可能会回滚您不想要的数据。你没有提供MVCE所以没有人能真正帮助你调试你的问题。
在这样的情况下进行货物编码是可以理解的,但这绝不是一个好习惯。要解决此问题,请调查SQLAlchemy中的cascades。此外,启动您的实际SQL数据库接口并查看数据的结构,并在配置文件中设置SQLALCHEMY_ECHO = 1
以查看实际发送的内容。
祝好运!
您不应该在开始时使用回滚,但在数据库操作失败时。该错误是由数据库中的完整性条件引起的。表中的某些行被另一个表引用。因此,您必须先删除引用行。