我是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)
来回滚此更改,因此在绑定数据库并创建会话和网站后,我将其放在应用程序的开头。这给了我把那条线留在那里的提示。我的举动正确,安全并且可以吗?任何人都可以告诉我该怎么做,如果这在某种程度上危及了我网站的功能或逻辑,那么该怎么做?
答案 0 :(得分:1)
您不应在开始时使用回滚,而应在数据库操作失败时使用。 该错误是由于数据库中的完整性状况引起的。表中的某些行正在被另一个表引用。因此,您必须先删除引用行。
答案 1 :(得分:1)
我要说的是,您的定义是cargo cult coding,应该尝试确定为什么首先要找到这些错误,而不是因为您不理解的原因而只包含一些代码
您描述的问题是使用外键确保数据库中数据完整性的结果。通常,SQLAlchemy将使所有依赖的外键无效,但是由于我对您的设置一无所知,因此无法解释为什么不这样做。也许这是数据库之间的区别。
将回滚放在路由(或整个全局应用程序)的开始处的一个大问题是,您可能会回滚不想使用的数据。您尚未提供MVCE,因此没有人能真正帮助您调试问题。
在这种情况下进行货物邪教编码是可以理解的,但这绝不是一个好习惯。要解决此问题,请研究SQLAlchemy中的cascades。另外,启动实际的SQL db接口,查看数据的结构,然后在配置文件中设置SQLALCHEMY_ECHO = 1
,以查看实际发出的内容。
祝你好运!