]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed a unit of work issue whereby the foreign
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 11 Apr 2009 20:20:38 +0000 (20:20 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 11 Apr 2009 20:20:38 +0000 (20:20 +0000)
key attribute on an item contained within a collection
owned by an object being deleted would not be set to
None if the relation() was self-referential. [ticket:1376]

CHANGES
lib/sqlalchemy/orm/unitofwork.py
test/orm/cycles.py

diff --git a/CHANGES b/CHANGES
index 418e7c2f6b9a39617f0caaa2a33948873637a0b1..2a82a58e34db931433fa2ac616df14d675d6429d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -36,6 +36,11 @@ CHANGES
       the default value is True, indicating a weak
       referencing map in use.
       
+    - Fixed a unit of work issue whereby the foreign
+      key attribute on an item contained within a collection 
+      owned by an object being deleted would not be set to
+      None if the relation() was self-referential. [ticket:1376]
+      
 - sql
     - ``sqlalchemy.extract()`` is now dialect sensitive and can
       extract components of timestamps idiomatically across the
index 8ad88982024fbbeae79b20f3abe3ba46397e4e37..4ac9c765e03bb9643f2e1c09f9e7b26f7c8d02c3 100644 (file)
@@ -720,6 +720,10 @@ class UOWExecutor(object):
 
     def execute_save_steps(self, trans, task):
         self.save_objects(trans, task)
+        for dep in task.polymorphic_cyclical_dependencies:
+            self.execute_dependency(trans, dep, False)
+        for dep in task.polymorphic_cyclical_dependencies:
+            self.execute_dependency(trans, dep, True)
         self.execute_cyclical_dependencies(trans, task, False)
         self.execute_dependencies(trans, task)
 
@@ -735,7 +739,5 @@ class UOWExecutor(object):
             self.execute_dependency(trans, dep, True)
 
     def execute_cyclical_dependencies(self, trans, task, isdelete):
-        for dep in task.polymorphic_cyclical_dependencies:
-            self.execute_dependency(trans, dep, isdelete)
         for t in task.dependent_tasks:
             self.execute(trans, [t], isdelete)
index 958afadaf32d0943f8a15e4625bf4459511432be..3e3636085247fcfabf22297d954f66581908414d 100644 (file)
@@ -108,7 +108,27 @@ class SelfReferentialTest(_base.MappedTest):
         sess.delete(a)
         sess.flush()
 
-
+    @testing.resolve_artifact_names
+    def test_setnull_ondelete(self):
+        mapper(C1, t1, properties={
+            'children':relation(C1)
+        })
+        
+        sess = create_session()
+        c1 = C1()
+        c2 = C1()
+        c1.children.append(c2)
+        sess.add(c1)
+        sess.flush()
+        assert c2.parent_c1 == c1.c1
+        
+        sess.delete(c1)
+        sess.flush()
+        assert c2.parent_c1 is None
+        
+        sess.expire_all()
+        assert c2.parent_c1 is None
+        
 class SelfReferentialNoPKTest(_base.MappedTest):
     """A self-referential relationship that joins on a column other than the primary key column"""