我对SQLAlchemy有点新鲜。我已经四处寻找我的问题的答案,但我发现没有什么能适合我的情况。
简而言之,只要TestResults中没有相关记录,删除Release模型中的记录将删除其他模型中的所有记录。但是,如果TestResult中有相关记录,则删除发布将不起作用。几乎似乎删除父母将删除孩子和孩子的孩子而不是孩子的孩子。以下是一些有助于强调这一点的代码:
unset( $_SESSION['YOUR_SESSION_VARIABLE_NAME'] );
有关为什么此级联删除无效的任何建议?
答案 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
编辑:(我应用的解决方案是在查询级别上更改加载类型-在选项中)