summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/unitofwork.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2006-08-22 22:52:12 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2006-08-22 22:52:12 +0000
commitf62e5a56e8a99ad3e0ab03f9bb3e0afd99872f58 (patch)
tree68ab8f2578ef9476be5d8620e4532f2db84b5dbe /lib/sqlalchemy/orm/unitofwork.py
parenta8d1aecfabe288dcfce3c01bfd87a5a6aff3683c (diff)
downloadsqlalchemy-f62e5a56e8a99ad3e0ab03f9bb3e0afd99872f58.tar.gz
the "check for orphans" step will cascade the delete operation to child objects.
Diffstat (limited to 'lib/sqlalchemy/orm/unitofwork.py')
-rw-r--r--lib/sqlalchemy/orm/unitofwork.py14
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/sqlalchemy/orm/unitofwork.py b/lib/sqlalchemy/orm/unitofwork.py
index 00d34a104..c0bb219a3 100644
--- a/lib/sqlalchemy/orm/unitofwork.py
+++ b/lib/sqlalchemy/orm/unitofwork.py
@@ -180,18 +180,24 @@ class UnitOfWork(object):
else:
objset = None
+ processed = util.Set()
for obj in [n for n in self.new] + [d for d in self.dirty]:
if objset is not None and not obj in objset:
continue
- if obj in self.deleted:
+ if obj in self.deleted or obj in processed:
continue
if object_mapper(obj)._is_orphan(obj):
- flush_context.register_object(obj, isdelete=True)
+ for c in [obj] + list(object_mapper(obj).cascade_iterator('delete', obj)):
+ if c in processed:
+ continue
+ flush_context.register_object(c, isdelete=True)
+ processed.add(c)
else:
flush_context.register_object(obj)
-
+ processed.add(obj)
+
for obj in self.deleted:
- if objset is not None and not obj in objset:
+ if (objset is not None and not obj in objset) or obj in processed:
continue
flush_context.register_object(obj, isdelete=True)