dom*_*om0 6 python sqlalchemy python-3.x
当使用更复杂的层次模型时,如何处理级联删除的不同设置,很难事先弄清楚delete()与数据库的确切关系.
我找不到任何方法来获取这条信息(" 嘿SQLAlchemy,如果我在那边删除那个对象会删除什么? ")来自SQLAlchemy.实现这一点并不是一种选择,因为这会迟早导致我的预测和不同的实际后果delete(),这对用户来说是非常不愉快的.
我在 SQLAlchemy 邮件列表上问了这个问题,
Michael Bayer 解释了可能的选项(再次非常感谢!:-):
刷新之前 session.deleted 中不存在的唯一删除是因为特定对象是“孤立对象”而发生的删除,以及由于该孤立对象上的级联而被删除的对象。
因此,在不考虑孤儿的情况下,session.deleted 会告诉您要删除的所有内容。
要考虑孤儿,需要像工作单元一样遍历所有关系,查找当前孤儿的对象(有一个 API 函数会告诉您这一点 - 如果该对象被引用的任何属性视为“孤儿”)删除孤儿级联到它,它被认为是“孤儿”),然后遍历这些孤儿的关系,将它们视为被标记为“已删除”,然后对那些新删除的对象再次执行所有规则。
现在的系统是由orm/dependency.py实现的。正常地在会话中运行一个工作单元进程可能并不难,但只是不发出 SQL,这将为您提供最终的刷新计划。但这是一个昂贵的过程,我不想一直调用。
这里添加功能很困难,因为用例不明确。知道将删除什么基本上需要实际进行一半的刷新过程。但是您已经可以在刷新过程本身内部实现事件,最直接的是 before_delete() 和 after_delete() 事件,这将保证捕获所有内容。因此,在您无论如何都进行刷新并且可以将事件放入其中之前,基本上运行一半刷新的新功能的基本原理尚不清楚。
我想最大的问题是“你什么时候打电话”。
一个简单的系统是添加一个新事件“flush_plan_complete”,该事件将在完整计划组装完成后、但在任何 SQL 发生之前将您置于刷新()状态。它可以允许您注册更多的活动对象,然后它会重新运行刷新计划以考虑任何新的更改(因为无论如何这就是它现在的工作方式)。如何进行注册是很棘手的,因为在那里正常使用会话会很好,但这使得实现起来更加复杂。但随后它可以再次迭代新的更改,并找到在正常进行之前需要采取的任何剩余步骤。