From: Mike Bayer Date: Sat, 11 Apr 2009 20:20:38 +0000 (+0000) Subject: - Fixed a unit of work issue whereby the foreign X-Git-Tag: rel_0_5_4~27 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=99d3e251cf6f24807138ef03cdd0f7c55b00e810;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - 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] --- diff --git a/CHANGES b/CHANGES index 418e7c2f6b..2a82a58e34 100644 --- 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 diff --git a/lib/sqlalchemy/orm/unitofwork.py b/lib/sqlalchemy/orm/unitofwork.py index 8ad8898202..4ac9c765e0 100644 --- a/lib/sqlalchemy/orm/unitofwork.py +++ b/lib/sqlalchemy/orm/unitofwork.py @@ -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) diff --git a/test/orm/cycles.py b/test/orm/cycles.py index 958afadaf3..3e36360852 100644 --- a/test/orm/cycles.py +++ b/test/orm/cycles.py @@ -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"""