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的选项可以有多个,中间用英文的逗号隔开