From: Mike Bayer Date: Tue, 18 Mar 2008 23:35:47 +0000 (+0000) Subject: some fixup to one-to-many delete cascade X-Git-Tag: rel_0_4_5~75 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7d33391e299f3659e3ffeae090b5e767b50919c7;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git some fixup to one-to-many delete cascade --- diff --git a/lib/sqlalchemy/orm/dependency.py b/lib/sqlalchemy/orm/dependency.py index 425b171df9..b6b6ce940d 100644 --- a/lib/sqlalchemy/orm/dependency.py +++ b/lib/sqlalchemy/orm/dependency.py @@ -182,7 +182,7 @@ class OneToManyDP(DependencyProcessor): # the child objects have to have their foreign key to the parent set to NULL # this phase can be called safely for any cascade but is unnecessary if delete cascade # is on. - if (not self.cascade.delete or self.post_update) and not self.passive_deletes=='all': + if self.post_update or not self.passive_deletes=='all': for state in deplist: (added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key,passive=self.passive_deletes) if unchanged or deleted: @@ -190,10 +190,11 @@ class OneToManyDP(DependencyProcessor): if child is not None and self.hasparent(child) is False: self._synchronize(state, child, None, True, uowcommit) self._conditional_post_update(child, uowcommit, [state]) - for child in unchanged: - if child is not None: - self._synchronize(state, child, None, True, uowcommit) - self._conditional_post_update(child, uowcommit, [state]) + if self.post_update or not self.cascade.delete: + for child in unchanged: + if child is not None: + self._synchronize(state, child, None, True, uowcommit) + self._conditional_post_update(child, uowcommit, [state]) else: for state in deplist: (added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key, passive=True) diff --git a/test/orm/unitofwork.py b/test/orm/unitofwork.py index 36222472d5..8f06b15889 100644 --- a/test/orm/unitofwork.py +++ b/test/orm/unitofwork.py @@ -668,11 +668,31 @@ class ExtraPassiveDeletesTest(ORMTest): assert myothertable.count().scalar() == 4 mc = sess.query(MyClass).get(mc.id) sess.delete(mc) - try: - sess.commit() - assert False - except exceptions.DBAPIError: - assert True + self.assertRaises(exceptions.DBAPIError, sess.commit) + + def test_extra_passive_2(self): + class MyClass(object): + pass + class MyOtherClass(object): + pass + + mapper(MyOtherClass, myothertable) + + mapper(MyClass, mytable, properties={ + 'children':relation(MyOtherClass, passive_deletes='all', cascade="save-update") + }) + + sess = Session + mc = MyClass() + mc.children.append(MyOtherClass()) + sess.save(mc) + sess.commit() + + assert myothertable.count().scalar() == 1 + mc = sess.query(MyClass).get(mc.id) + sess.delete(mc) + mc.children[0].data = 'some new data' + self.assertRaises(exceptions.DBAPIError, sess.commit) class DefaultTest(ORMTest):