summaryrefslogtreecommitdiff
path: root/test/orm/test_cascade.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-09-22 14:22:16 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2010-09-22 14:22:16 -0400
commiteae4de02a9b9bcf070a12607ada4098fb63e26f2 (patch)
treecbd9765b89832506b29d06454bcc4ce586d78f3e /test/orm/test_cascade.py
parent7b8b23b42700598adf2ee79083aa13dbca5e75e7 (diff)
downloadsqlalchemy-eae4de02a9b9bcf070a12607ada4098fb63e26f2.tar.gz
- in depth docs about some merge() tips
- docs about backref cascade - Another new flag on relationship(), cascade_backrefs, disables the "save-update" cascade when the event was initiated on the "reverse" side of a bidirectional relationship. This is a cleaner behavior so that many-to-ones can be set on a transient object without it getting sucked into the child object's session, while still allowing the forward collection to cascade. We *might* default this to False in 0.7.
Diffstat (limited to 'test/orm/test_cascade.py')
-rw-r--r--test/orm/test_cascade.py63
1 files changed, 62 insertions, 1 deletions
diff --git a/test/orm/test_cascade.py b/test/orm/test_cascade.py
index 1c935df13..75b9e22ec 100644
--- a/test/orm/test_cascade.py
+++ b/test/orm/test_cascade.py
@@ -4,7 +4,7 @@ from sqlalchemy import Integer, String, ForeignKey, Sequence, \
exc as sa_exc
from sqlalchemy.test.schema import Table, Column
from sqlalchemy.orm import mapper, relationship, create_session, \
- sessionmaker, class_mapper, backref
+ sessionmaker, class_mapper, backref, Session
from sqlalchemy.orm import attributes, exc as orm_exc
from sqlalchemy.test import testing
from sqlalchemy.test.testing import eq_
@@ -939,6 +939,67 @@ class M2MCascadeTest(_base.MappedTest):
assert b1 not in a1.bs
assert b1 in a2.bs
+class NoBackrefCascadeTest(_fixtures.FixtureTest):
+ run_inserts = None
+
+ @classmethod
+ @testing.resolve_artifact_names
+ def setup_mappers(cls):
+ mapper(Address, addresses)
+ mapper(User, users, properties={
+ 'addresses':relationship(Address, backref='user',
+ cascade_backrefs=False)
+ })
+
+ mapper(Dingaling, dingalings, properties={
+ 'address' : relationship(Address, backref='dingalings',
+ cascade_backrefs=False)
+ })
+
+ @testing.resolve_artifact_names
+ def test_o2m(self):
+ sess = Session()
+
+ u1 = User(name='u1')
+ sess.add(u1)
+
+ a1 = Address(email_address='a1')
+ a1.user = u1
+ assert a1 not in sess
+
+ sess.commit()
+
+ assert a1 not in sess
+
+ sess.add(a1)
+
+ d1 = Dingaling()
+ d1.address = a1
+ assert d1 in a1.dingalings
+ assert d1 in sess
+
+ sess.commit()
+
+ @testing.resolve_artifact_names
+ def test_m2o(self):
+ sess = Session()
+
+ a1 = Address(email_address='a1')
+ d1 = Dingaling()
+ sess.add(d1)
+
+ a1.dingalings.append(d1)
+ assert a1 not in sess
+
+ a2 = Address(email_address='a2')
+ sess.add(a2)
+
+ u1 = User(name='u1')
+ u1.addresses.append(a2)
+ assert u1 in sess
+
+ sess.commit()
+
class UnsavedOrphansTest(_base.MappedTest):
"""Pending entities that are orphans"""