]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
some fixup to one-to-many delete cascade
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 18 Mar 2008 23:35:47 +0000 (23:35 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 18 Mar 2008 23:35:47 +0000 (23:35 +0000)
lib/sqlalchemy/orm/dependency.py
test/orm/unitofwork.py

index 425b171df9e92c22194e485f8f815c5afee64da0..b6b6ce940d56de0e8a16a40d1a71b654a55486cc 100644 (file)
@@ -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)
index 36222472d52f00c85a41c4e20757a2dcc9e85b01..8f06b1588961acca151cfcfe24ae23ee4e9eb6a7 100644 (file)
@@ -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):