# 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:
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)
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):