根据van的评论,我能够找到解决方案。默认关系级联为
"save-update, merge"。我必须将此设置为
"save-update, merge,delete, delete-orphan"。
单独添加
delete并不能改变行为,这
delete-orphan是必要的。
添加仅
delete-orphan使删除测试用例失败,并带有问题中提到的“依赖关系规则”断言错误:
class HierarchicModelTest(unittest.TestCase): def test_delete_parent_object(self): foo = Foo(**foo_data).save() self.assertEqual(Foo.query.count(), 1) self.assertEqual(FooCycle.query.count(), 1) s = get_session() s.delete(foo) s.flush() self.assertEqual(Foo.query.count(), 0) self.assertEqual(FooCycle.query.count(), 0)
-
File "/home/xxx/xxx/xxx/backend/tests/test_core.py", line 128, in test_delete_parent_object s.flush() [...] AssertionError: Dependency rule tried to blank-out primary key column 'foocycle.foo_id' on instance '<FooCycle at 0x37a1710>'
从SQLAlchemy文档中:
delete-orphan级联为级联添加了行为delete,这样子对象在与父对象解除关联时将被标记为删除,而不仅仅是父对象被标记为删除。
因此,FooCycle模型的正确定义是
class FooCycle(base): __tablename__ = 'foocycle' foo_id = Column( String(50), ForeignKey('foo.id'), primary_key=True ) some_number = Column( Integer, primary_key=True, ) foo = relationship("Foo", backref=backref("cycles", cascade="save-update, merge, " "delete, delete-orphan"))


