SQLAlchemy不会级联删除多个级别

时间:2017-09-28 20:44:54

标签: python sqlalchemy flask-sqlalchemy

我对SQLAlchemy有点新鲜。我已经四处寻找我的问题的答案,但我发现没有什么能适合我的情况。

简而言之,只要TestResults中没有相关记录,删除Release模型中的记录将删除其他模型中的所有记录。但是,如果TestResult中有相关记录,则删除发布将不起作用。几乎似乎删除父母将删除孩子和孩子的孩子而不是孩子的孩子。以下是一些有助于强调这一点的代码:

unset( $_SESSION['YOUR_SESSION_VARIABLE_NAME'] );

有关为什么此级联删除无效的任何建议?

1 个答案:

答案 0 :(得分:1)

我在我们的项目中遇到了类似的问题,我们在ORM级别定义了级联,还使用了lazy=dynamic关系。这导致级联不在最底层的子级上运行。

动态加载会导致该关系在访问时返回一个Query对象。

为了提高性能,删除查询非常有限,如此处所述: https://docs.sqlalchemy.org/en/13/orm/query.html

  

该方法不提供Python中的级联关系-它   假设ON DELETE CASCADE / SET NULL / etc。为任何配置   需要它的外键引用,否则数据库可能   如果正在使用外键引用,则发出完整性冲突   强制执行。

     

DELETE之后,会话中的相关对象受到影响   通过ON DELETE可能不包含当前状态,或者可能已经   已删除。会话过期后即可解决此问题,   通常发生在Session.commit()上,或者可以通过使用   Session.expire_all()。访问行已到的过期对象   已删除   将调用SELECT来定位行;当找不到该行时,   引发ObjectDeletedError。

因此,解决您的问题的方法可能是在数据库级别定义级联,或者使用其他类型的关系。

在此提出了相关问题:SQLAlchemy delete doesn't cascade

编辑:(我应用的解决方案是在查询级别上更改加载类型-在选项中)