orm层面的删除的注意事项

orm层面的删除

当两张表的外键约束设置为RESTRICT or ACTION时,在sql的层面上想要删除父级表的数据时吗,mysql会拒绝删除,但是
使用orm的delete还是会删除父级表的数据。orm会先将自表的外键设置为null,然后在去删除父表的数据,为了避免这种情况,外键应该设置为nullable=False

在sqlalchemy,只要将一个数据添加到session中,和它相关联的数据都可以一起存入到数据库中了。
这些是通过设置relationship的关键字参数cascade的来设置的:

1 .save-update: 默认选项。在添加一条数据的时候,会把和它关联的数据都添加到数据库中。这种行为就是由save-update属性影响的。
2 . delete: 表示当删除某一个模型中的数据的时候,是否也删除使用relationship和他关联的数据。
3 .delete-orphan:表示当对一个orm对象解除了父表中的关联对象的时候,自己便会被删掉。当然如果父表中的数据被删除,自己也会变删除。这个选项只能用在一对多上,不猛用在多对多以及多对一上。并且还需要子模型中的relationship中,增加一个single_parent=True.
4 .merge: 默认选项,当在使用session.merge, 合并一个对象的时候,会将使用了relationship相关联的对象也进行merge操作。
5 . expunge: 移除操作的时候,会将相关联的对象也进行删除。这个操作只是从session中删除,并不会真正的从数据库中删除。
6 . all:是对save-update, merge, refresh-expire, expunge, delete几种的缩写。

cascade的选项可以有多个,中间用英文的逗号隔开

原文地址:https://www.cnblogs.com/ivy-blogs/p/11550309.html