]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
backrefs on cyclical relationships were breaking for the "root" node which had None...
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 27 Mar 2006 02:02:06 +0000 (02:02 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 27 Mar 2006 02:02:06 +0000 (02:02 +0000)
lib/sqlalchemy/mapping/properties.py
lib/sqlalchemy/mapping/unitofwork.py
test/cycles.py

index 10d6472f4c88cc30be36d64bab445d4367becf9e..b18d4d54fe6a8d02ceac8792164fec93a02b9a4c 100644 (file)
@@ -382,6 +382,9 @@ class PropertyLoader(MapperProperty):
             else:
                 uowcommit.register_dependency(self.mapper, self.parent)
                 uowcommit.register_processor(self.mapper, self, self.parent, False)
+                # this dependency processor is used to locate "private" child objects
+                # during a "delete" operation, when the objectstore is being committed
+                # with only a partial list of objects
                 uowcommit.register_processor(self.mapper, self, self.parent, True)
         else:
             raise AssertionError(" no foreign key ?")
index 0b392b44709fd8848455268ef40b23b9e93617e4..1eea546df7d11cb790b0137f865b45595d856fe7 100644 (file)
@@ -647,6 +647,10 @@ class UOWTask(object):
                         childlist = childlist.added_items()
                         
                     for o in childlist:
+                        if o is None:
+                            # this can be None due to the many-to-one dependency processor added
+                            # for deleted items, line 385 properties.py
+                            continue
                         if not o in childtask.objects:
                             # item needs to be saved since its added, or attached to a deleted object
                             childtask.append(o, isdelete=isdelete and dep.processor.private)
index 9114eb4fe008a7f9c7dc563009bf3bb79aa50de3..02d34bbb0c0d712f4383460af43f10461e612b6c 100644 (file)
@@ -44,6 +44,19 @@ class SelfReferentialTest(AssertMixin):
         objectstore.clear()
         clear_mappers()
     
+    def testsingle(self):
+        class C1(Tester):
+            pass
+        m1 = mapper(C1, t1, properties = {
+            'c1s':relation(C1, private=True),
+            'parent':relation(C1, primaryjoin=t1.c.parent_c1==t1.c.c1, foreignkey=t1.c.c1, lazy=True, uselist=False)
+        })
+        a = C1('head c1')
+        a.c1s.append(C1('another c1'))
+        objectstore.commit()
+        objectstore.delete(a)
+        objectstore.commit()
+        
     def testcycle(self):
         class C1(Tester):
             pass