diff options
author | Matt Chisholm <matt@theory.org> | 2013-06-15 18:15:29 +0200 |
---|---|---|
committer | Matt Chisholm <matt@theory.org> | 2013-06-15 18:15:29 +0200 |
commit | d6c60cb2f3b1bf27f10aecf542fc0e3f3f903183 (patch) | |
tree | 5256b6ce425d43b6f2ac3c6a5da41f0c1891a7a7 | |
parent | 9d3e2206363d819ad334d7893c700b861fdc5b57 (diff) | |
download | sqlalchemy-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.py | 8 | ||||
-rw-r--r-- | examples/versioning/test_versioning.py | 37 |
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() |