]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
fixed replacement of existing column properties with synonyms, [ticket:888]
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 4 Dec 2007 15:53:23 +0000 (15:53 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 4 Dec 2007 15:53:23 +0000 (15:53 +0000)
lib/sqlalchemy/orm/mapper.py
test/orm/mapper.py

index c69881622bac8b1b10c93eea8af04070dc060cc2..f7bf3f5d9d9840f940edd90523992d0d9b5a492a 100644 (file)
@@ -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:
index f0d553630213279aa83b4955547ec2a76e2cd035..36f0561567aa8fc7cced98afe46d241d493a4663 100644 (file)
@@ -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()