summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Chisholm <matt@theory.org>2013-06-15 18:15:29 +0200
committerMatt Chisholm <matt@theory.org>2013-06-15 18:15:29 +0200
commitd6c60cb2f3b1bf27f10aecf542fc0e3f3f903183 (patch)
tree5256b6ce425d43b6f2ac3c6a5da41f0c1891a7a7
parent9d3e2206363d819ad334d7893c700b861fdc5b57 (diff)
downloadsqlalchemy-d6c60cb2f3b1bf27f10aecf542fc0e3f3f903183.tar.gz
don't create a history entry when an object in a backref has changed
The code that determines whether an object in a relation has been added/removed does not take into account that that relation may be a backref. If the relation is a backref, then nothing on the current table is changing, and therefore no history entry should be created.
-rw-r--r--examples/versioning/history_meta.py8
-rw-r--r--examples/versioning/test_versioning.py37
2 files changed, 42 insertions, 3 deletions
diff --git a/examples/versioning/history_meta.py b/examples/versioning/history_meta.py
index 45f1c8369..deef67a0a 100644
--- a/examples/versioning/history_meta.py
+++ b/examples/versioning/history_meta.py
@@ -158,8 +158,12 @@ def create_version(obj, session, deleted = False):
for prop in obj_mapper.iterate_properties:
if isinstance(prop, RelationshipProperty) and \
attributes.get_history(obj, prop.key).has_changes():
- obj_changed = True
- break
+ for p in prop.local_columns:
+ if p.foreign_keys:
+ obj_changed = True
+ break
+ if obj_changed is True:
+ break
if not obj_changed and not deleted:
return
diff --git a/examples/versioning/test_versioning.py b/examples/versioning/test_versioning.py
index 5b57ecaa2..2bc18df63 100644
--- a/examples/versioning/test_versioning.py
+++ b/examples/versioning/test_versioning.py
@@ -306,7 +306,7 @@ class TestVersioning(TestCase):
id = Column(Integer, primary_key=True)
name = Column(String(50))
related_id = Column(Integer, ForeignKey('somerelated.id'))
- related = relationship("SomeRelated")
+ related = relationship("SomeRelated", backref='classes')
SomeClassHistory = SomeClass.__history_mapper__.class_
@@ -341,3 +341,38 @@ class TestVersioning(TestCase):
assert sc.version == 3
+ def test_backref_relationship(self):
+
+ class SomeRelated(Base, ComparableEntity):
+ __tablename__ = 'somerelated'
+
+ id = Column(Integer, primary_key=True)
+ name = Column(String(50))
+ related_id = Column(Integer, ForeignKey('sometable.id'))
+ related = relationship("SomeClass", backref='related')
+
+ class SomeClass(Versioned, Base, ComparableEntity):
+ __tablename__ = 'sometable'
+
+ id = Column(Integer, primary_key=True)
+
+ self.create_tables()
+ sess = Session()
+ sc = SomeClass()
+ sess.add(sc)
+ sess.commit()
+
+ assert sc.version == 1
+
+ sr = SomeRelated(name='sr', related=sc)
+ sess.add(sr)
+ sess.commit()
+
+ assert sc.version == 1
+
+ sr.name = 'sr2'
+ sess.commit()
+
+ assert sc.version == 1
+ sess.delete(sr)
+ sess.commit()