From: Mike Bayer Date: Tue, 4 Dec 2007 15:53:23 +0000 (+0000) Subject: fixed replacement of existing column properties with synonyms, [ticket:888] X-Git-Tag: rel_0_4_2~115 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=aa71eed4e26914cbd2dea19676b7fddef13d938a;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git fixed replacement of existing column properties with synonyms, [ticket:888] --- diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index c69881622b..f7bf3f5d9d 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -667,6 +667,8 @@ class Mapper(object): self._columntoproperty[col] = prop elif isinstance(prop, SynonymProperty): prop.instrument = getattr(self.class_, key, None) + if isinstance(prop.instrument, Mapper._CompileOnAttr): + prop.instrument = None if prop.map_column: if not key in self.select_table.c: raise exceptions.ArgumentError("Can't compile synonym '%s': no column on table '%s' named '%s'" % (prop.name, self.select_table.description, key)) @@ -725,7 +727,6 @@ class Mapper(object): if not self.non_primary and '_class_state' in self.class_.__dict__ and (self.entity_name in self.class_._class_state.mappers): raise exceptions.ArgumentError("Class '%s' already has a primary mapper defined with entity name '%s'. Use non_primary=True to create a non primary Mapper. clear_mappers() will remove *all* current mappers from all classes." % (self.class_, self.entity_name)) - def extra_init(class_, oldinit, instance, args, kwargs): self.compile() if 'init_instance' in self.extension.methods: diff --git a/test/orm/mapper.py b/test/orm/mapper.py index f0d5536302..36f0561567 100644 --- a/test/orm/mapper.py +++ b/test/orm/mapper.py @@ -155,7 +155,7 @@ class MapperTest(MapperSuperTest): mapper(Foo, addresses, inherits=User) assert getattr(Foo().__class__, 'user_name').impl is not None - def test_addproperty(self): + def test_add_property(self): m = mapper(User, users) mapper(Address, addresses) m.add_property('user_name', deferred(users.c.user_name)) @@ -170,15 +170,40 @@ class MapperTest(MapperSuperTest): def go(): self.assert_result([u], User, user_address_result[0]) assert u.user_name == 'jack' - + assert u.name == 'jack' self.assert_sql_count(testbase.db, go, 2) + u.name = 'ed' u3 = User() u3.user_name = 'some user' sess.save(u3) sess.flush() sess.rollback() - + + def test_replace_property(self): + m = mapper(User, users) + m.add_property('_user_name',users.c.user_name) + m.add_property('user_name', synonym('_user_name', proxy=True)) + + sess = create_session() + u = sess.query(User).filter_by(user_name='jack').one() + assert u._user_name == 'jack' + assert u.user_name == 'jack' + u.user_name = 'jacko' + assert m._columntoproperty[users.c.user_name] is m.get_property('_user_name') + + clear_mappers() + + m = mapper(User, users) + m.add_property('user_name', synonym('_user_name', map_column=True)) + + sess.clear() + u = sess.query(User).filter_by(user_name='jack').one() + assert u._user_name == 'jack' + assert u.user_name == 'jack' + u.user_name = 'jacko' + assert m._columntoproperty[users.c.user_name] is m.get_property('_user_name') + def test_illegal_non_primary(self): mapper(User, users) mapper(Address, addresses) @@ -409,6 +434,7 @@ class MapperTest(MapperSuperTest): assert u.uname == "some user name" assert u.user_name == "some user name" assert u in sess.dirty + def test_column_synonyms(self): """test new-style synonyms which automatically instrument properties, set up aliased column, etc.""" @@ -456,6 +482,7 @@ class MapperTest(MapperSuperTest): assert u.user_name == 'foo' assert assert_col == [('get', 'jack'), ('set', 'foo'), ('get', 'foo')] + @testing.fails_on('maxdb') def test_synonymoptions(self): sess = create_session()