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

时间:2019-02-25 08:10:56

标签: python session flask sqlalchemy rollback

我是Flask和Web开发的新手。我有一个使用SQLAlchemy的Flask网络应用程序,即使在交易失败后,也可以将column D放在应用程序的开头,以使其保持运行状态吗? 当我尝试删除一个表的记录后,该网站停止运行时,我的网站出现问题。错误日志显示,由于另一个表中的条目仍将这些记录引用为其外键,因此删除失败。错误日志建议使用def meanFunc(row): minDiffPairIndex = np.argmin( [abs(row['A']-row['B']), abs(row['B']-row['C']), abs(row['C']-row['A']) ]) meanDict = {0: np.mean([row['A'], row['B']]), 1: np.mean([row['B'], row['C']]), 2: np.mean([row['C'], row['A']])} return meanDict[minDiffPairIndex] df['D'] = df.apply(meanFunc, axis=1) 来回滚此更改,因此在绑定数据库并创建会话和网站后,我将其放在应用程序的开头。这给了我把那条线留在那里的提示。我的举动正确,安全并且可以吗?任何人都可以告诉我该怎么做,如果这在某种程度上危及了我网站的功能或逻辑,那么该怎么做?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我要说的是,您的定义是cargo cult coding,应该尝试确定为什么首先要找到这些错误,而不是因为您不理解的原因而只包含一些代码

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

将回滚放在路由(或整个全局应用程序)的开始处的一个大问题是,您可能会回滚不想使用的数据。您尚未提供MVCE,因此没有人能真正帮助您调试问题。

在这种情况下进行货物邪教编码是可以理解的,但这绝不是一个好习惯。要解决此问题,请研究SQLAlchemy中的cascades。另外,启动实际的SQL db接口,查看数据的结构,然后在配置文件中设置SQLALCHEMY_ECHO = 1,以查看实际发出的内容。

祝你好运!