summaryrefslogtreecommitdiff
path: root/test/orm
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2015-06-24 21:53:15 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2015-06-24 21:53:15 -0400
commit1e2f1f5baabd4ec8866ec19b586bb493ea099852 (patch)
tree73ecc79079315d2e86cbdc0ebffba0f8a48eeada /test/orm
parent00656ae4930620bc8c0c4be6a82853f01c90f758 (diff)
downloadsqlalchemy-1e2f1f5baabd4ec8866ec19b586bb493ea099852.tar.gz
- Fixed a major regression in the 1.0 series where the version_id_counter
feature would cause an object's version counter to be incremented when there was no net change to the object's row, but instead an object related to it via relationship (e.g. typically many-to-one) were associated or de-associated with it, resulting in an UPDATE statement that updates the object's version counter and nothing else. In the use case where the relatively recent "server side" and/or "programmatic/conditional" version counter feature were used (e.g. setting version_id_generator to False), the bug could cause an UPDATE without a valid SET clause to be emitted. fixes #3465
Diffstat (limited to 'test/orm')
-rw-r--r--test/orm/test_versioning.py134
1 files changed, 134 insertions, 0 deletions
diff --git a/test/orm/test_versioning.py b/test/orm/test_versioning.py
index 8348cb588..2d447682a 100644
--- a/test/orm/test_versioning.py
+++ b/test/orm/test_versioning.py
@@ -355,6 +355,93 @@ class VersioningTest(fixtures.MappedTest):
)
+class NoBumpOnRelationshipTest(fixtures.MappedTest):
+ __backend__ = True
+
+ @classmethod
+ def define_tables(cls, metadata):
+ Table(
+ 'a', metadata,
+ Column('id', Integer, primary_key=True),
+ Column('version_id', Integer)
+ )
+ Table(
+ 'b', metadata,
+ Column('id', Integer, primary_key=True),
+ Column('a_id', ForeignKey('a.id'))
+ )
+
+ @classmethod
+ def setup_classes(cls):
+ class A(cls.Basic):
+ pass
+
+ class B(cls.Basic):
+ pass
+
+ def _run_test(self, auto_version_counter=True):
+ A, B = self.classes('A', 'B')
+ s = Session()
+ if auto_version_counter:
+ a1 = A()
+ else:
+ a1 = A(version_id=1)
+ s.add(a1)
+ s.commit()
+ eq_(a1.version_id, 1)
+
+ b1 = B()
+ b1.a = a1
+ s.add(b1)
+ s.commit()
+
+ eq_(a1.version_id, 1)
+
+ def test_plain_counter(self):
+ A, B = self.classes('A', 'B')
+ a, b = self.tables('a', 'b')
+
+ mapper(
+ A, a, properties={
+ 'bs': relationship(B, backref='a')
+ },
+ version_id_col=a.c.version_id,
+ )
+ mapper(B, b)
+
+ self._run_test()
+
+ def test_functional_counter(self):
+ A, B = self.classes('A', 'B')
+ a, b = self.tables('a', 'b')
+
+ mapper(
+ A, a, properties={
+ 'bs': relationship(B, backref='a')
+ },
+ version_id_col=a.c.version_id,
+ version_id_generator=lambda num: (num or 0) + 1
+ )
+ mapper(B, b)
+
+ self._run_test()
+
+ def test_no_counter(self):
+ A, B = self.classes('A', 'B')
+ a, b = self.tables('a', 'b')
+
+ mapper(
+ A, a, properties={
+ 'bs': relationship(B, backref='a')
+ },
+ version_id_col=a.c.version_id,
+ version_id_generator=False
+ )
+ mapper(B, b)
+
+ self._run_test(False)
+
+
class ColumnTypeTest(fixtures.MappedTest):
__backend__ = True
@@ -587,6 +674,53 @@ class AlternateGeneratorTest(fixtures.MappedTest):
sess2.commit
+class PlainInheritanceTest(fixtures.MappedTest):
+ __backend__ = True
+
+ @classmethod
+ def define_tables(cls, metadata):
+ Table(
+ 'base', metadata,
+ Column(
+ 'id', Integer, primary_key=True,
+ test_needs_autoincrement=True),
+ Column('version_id', Integer, nullable=True),
+ Column('data', String(50))
+ )
+ Table(
+ 'sub', metadata,
+ Column('id', Integer, ForeignKey('base.id'), primary_key=True),
+ Column('sub_data', String(50))
+ )
+
+ @classmethod
+ def setup_classes(cls):
+
+ class Base(cls.Basic):
+ pass
+
+ class Sub(Base):
+ pass
+
+ def test_update_child_table_only(self):
+ Base, sub, base, Sub = (
+ self.classes.Base, self.tables.sub, self.tables.base,
+ self.classes.Sub)
+
+ mapper(Base, base, version_id_col=base.c.version_id)
+ mapper(Sub, sub, inherits=Base)
+
+ s = Session()
+ s1 = Sub(data='b', sub_data='s')
+ s.add(s1)
+ s.commit()
+
+ s1.sub_data = 's2'
+ s.commit()
+
+ eq_(s1.version_id, 2)
+
+
class InheritanceTwoVersionIdsTest(fixtures.MappedTest):
"""Test versioning where both parent/child table have a
versioning column.