[Sqlalchemy-tickets] Issue #4193: versioning logic fails for mapping against a select stmt, 1.2 reg
Brought to you by:
zzzeek
From: Michael B. <iss...@bi...> - 2018-02-28 07:06:57
|
New issue 4193: versioning logic fails for mapping against a select stmt, 1.2 regression https://bitbucket.org/zzzeek/sqlalchemy/issues/4193/versioning-logic-fails-for-mapping-against Michael Bayer: ``` #!python class VersioningMappedSelectTest(fixtures.MappedTest): __backend__ = True @classmethod def define_tables(cls, metadata): Table('version_table', metadata, Column('id', Integer, primary_key=True, test_needs_autoincrement=True), Column('version_id', Integer, nullable=False), Column('value', String(40), nullable=False)) @classmethod def setup_classes(cls): class Foo(cls.Basic): pass def _fixture(self): Foo, version_table = self.classes.Foo, self.tables.version_table current = version_table.select().\ where(version_table.c.id > 0).alias('current_table') mapper(Foo, current, version_id_col=version_table.c.version_id) s1 = Session() return s1 @testing.emits_warning(r".*versioning cannot be verified") def test_multiple_updates(self): Foo = self.classes.Foo s1 = self._fixture() f1 = Foo(value='f1') f2 = Foo(value='f2') s1.add_all((f1, f2)) s1.commit() f1.value = 'f1rev2' f2.value = 'f2rev2' s1.commit() eq_( s1.query(Foo.id, Foo.value, Foo.version_id).order_by(Foo.id).all(), [(f1.id, 'f1rev2', 2), (f2.id, 'f2rev2', 2)] ) ``` result: ``` #! Traceback (most recent call last): File "/home/classic/dev/sqlalchemy/test/orm/test_versioning.py", line 1682, in test_multiple_updates s1.commit() File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/session.py", line 943, in commit self.transaction.commit() File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/session.py", line 467, in commit self._prepare_impl() File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/session.py", line 447, in _prepare_impl self.session.flush() File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/session.py", line 2243, in flush self._flush(objects) File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/session.py", line 2369, in _flush transaction.rollback(_capture_exception=True) File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/util/langhelpers.py", line 66, in __exit__ compat.reraise(exc_type, exc_value, exc_tb) File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/util/compat.py", line 187, in reraise raise value File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/session.py", line 2333, in _flush flush_context.execute() File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/unitofwork.py", line 391, in execute rec.execute(self) File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/unitofwork.py", line 556, in execute uow File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/persistence.py", line 193, in save_obj update_version_id in states_to_update File "/home/classic/dev/sqlalchemy/test/../lib/sqlalchemy/orm/persistence.py", line 1132, in _finalize_insert_update_commands if state_dict[mapper._version_id_prop.key] is None: KeyError: 'version_id' ``` |