On Wed, Feb 21, 2018 at 10:04 AM, Mike Bayer <mike...@zzzcomputing.com> wrote:
> On Wed, Feb 21, 2018 at 6:33 AM, Jeff Horemans <horemansj...@gmail.com> wrote:
>> When migrating from 1.1 tot 1.2, we noticed that the version_id is not
>> getting set on a class that maps to a select of a table.
>> I've added a test case class below to the test_versioning.py included in
>> SQLAlchemy to confirm this behaviour.
>> This case runs fine in versions 1.0 and 1.1, but gives a KeyError on the
>> version_id in 1.2 as shown in the stack traces below.
>>
>> I'll be happy to make an issue on the repository if needed.
>
> no need, this is completely perfect, I'll create the issue.  I hope to
> get this into 1.2.4 which I need to release hopefully this week /
> today preferred (but I've wanted to release for two days already, ran
> out of time).   thanks!

this is 
https://bitbucket.org/zzzeek/sqlalchemy/issues/4193/versioning-logic-fails-for-mapping-against
, where you'll note that I found two more issues with versioning and
mappers to select statements, which you've already been working
around.  this is not a use case we tested for.


>
>
>>
>> class VersioningSelectTest(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)]
>>         )
>>
>>
>>
>> FAIL
>> test/orm/test_versioning.py::VersioningSelectTest_postgresql+psycopg2_9_5_11::()::test_multiple_updates
>>
>> ================================================================== FAILURES
>> ==================================================================
>> ___________________________________
>> VersioningSelectTest_postgresql+psycopg2_9_5_11.test_multiple_updates
>> ____________________________________
>> Traceback (most recent call last):
>>   File
>> "/home/jeffh/vortex-workspace/v-finance/subrepos/SQLAlchemy-1.2.3/test/orm/test_versioning.py",
>> line 131, in test_multiple_updates
>>     s1.commit()
>>   File
>> "/home/jeffh/vortex-workspace/v-finance/subrepos/SQLAlchemy-1.2.3/test/../lib/sqlalchemy/orm/session.py",
>> line 943, in commit
>>     self.transaction.commit()
>>   File
>> "/home/jeffh/vortex-workspace/v-finance/subrepos/SQLAlchemy-1.2.3/test/../lib/sqlalchemy/orm/session.py",
>> line 467, in commit
>>     self._prepare_impl()
>>   File
>> "/home/jeffh/vortex-workspace/v-finance/subrepos/SQLAlchemy-1.2.3/test/../lib/sqlalchemy/orm/session.py",
>> line 447, in _prepare_impl
>>     self.session.flush()
>>   File
>> "/home/jeffh/vortex-workspace/v-finance/subrepos/SQLAlchemy-1.2.3/test/../lib/sqlalchemy/orm/session.py",
>> line 2243, in flush
>>     self._flush(objects)
>>   File
>> "/home/jeffh/vortex-workspace/v-finance/subrepos/SQLAlchemy-1.2.3/test/../lib/sqlalchemy/orm/session.py",
>> line 2369, in _flush
>>     transaction.rollback(_capture_exception=True)
>>   File
>> "/home/jeffh/vortex-workspace/v-finance/subrepos/SQLAlchemy-1.2.3/test/../lib/sqlalchemy/util/langhelpers.py",
>> line 66, in __exit__
>>     compat.reraise(exc_type, exc_value, exc_tb)
>>   File
>> "/home/jeffh/vortex-workspace/v-finance/subrepos/SQLAlchemy-1.2.3/test/../lib/sqlalchemy/orm/session.py",
>> line 2333, in _flush
>>     flush_context.execute()
>>   File
>> "/home/jeffh/vortex-workspace/v-finance/subrepos/SQLAlchemy-1.2.3/test/../lib/sqlalchemy/orm/unitofwork.py",
>> line 391, in execute
>>     rec.execute(self)
>>   File
>> "/home/jeffh/vortex-workspace/v-finance/subrepos/SQLAlchemy-1.2.3/test/../lib/sqlalchemy/orm/unitofwork.py",
>> line 556, in execute
>>     uow
>>   File
>> "/home/jeffh/vortex-workspace/v-finance/subrepos/SQLAlchemy-1.2.3/test/../lib/sqlalchemy/orm/persistence.py",
>> line 193, in save_obj
>>     update_version_id in states_to_update
>>   File
>> "/home/jeffh/vortex-workspace/v-finance/subrepos/SQLAlchemy-1.2.3/test/../lib/sqlalchemy/orm/persistence.py",
>> line 1131, in _finalize_insert_update_commands
>>     if state_dict[mapper._version_id_prop.key] is None:
>> KeyError: u'version_id
>>
>> --
>> SQLAlchemy -
>> The Python SQL Toolkit and Object Relational Mapper
>>
>> http://www.sqlalchemy.org/
>>
>> To post example code, please provide an MCVE: Minimal, Complete, and
>> Verifiable Example. See http://stackoverflow.com/help/mcve for a full
>> description.
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "sqlalchemy" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to sqlalchemy+unsubscr...@googlegroups.com.
>> To post to this group, send email to sqlalchemy@googlegroups.com.
>> Visit this group at https://groups.google.com/group/sqlalchemy.
>> For more options, visit https://groups.google.com/d/optout.

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to