]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
mapper double checks that columns in _compile_property are in the _cols_by_table...
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 18 Mar 2008 02:38:11 +0000 (02:38 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 18 Mar 2008 02:38:11 +0000 (02:38 +0000)
lib/sqlalchemy/orm/mapper.py
test/ext/declarative.py

index 15fab081660f2412ddeeae147d9007f65a1511fb..55dcabd32ed2dabf811539dcfc05173efec8f437 100644 (file)
@@ -649,11 +649,18 @@ class Mapper(object):
             # columns (included in zblog tests)
             if col is None:
                 col = prop.columns[0]
+            else:
+                # if column is coming in after _cols_by_table was initialized, ensure the col is in the 
+                # right set
+                if hasattr(self, '_cols_by_table') and col.table in self._cols_by_table and col not in self._cols_by_table[col.table]:
+                    self._cols_by_table[col.table].add(col)
 
             self.columns[key] = col
             for col in prop.columns:
                 for col in col.proxy_set:
                     self._columntoproperty[col] = prop
+            
+                
         elif isinstance(prop, SynonymProperty) and setparent:
             if prop.instrument is None:
                 prop.instrument = getattr(self.class_, key, None)
index 44f34cb446e4f12450251efeb6cb98fdd8556c97..4cddd684fa664dd5ae72699f68f471cc01f21545 100644 (file)
@@ -57,6 +57,47 @@ class DeclarativeTest(TestBase):
         self.assertEquals(a1, Address(email='two'))
         self.assertEquals(a1.user, User(name='u1'))
 
+    def test_add_prop(self):
+        class User(Base, Fixture):
+            __tablename__ = 'users'
+
+            id = Column('id', Integer, primary_key=True)
+        User.name = Column('name', String(50))
+        User.addresses = relation("Address", backref="user")
+
+        class Address(Base, Fixture):
+            __tablename__ = 'addresses'
+
+            id = Column(Integer, primary_key=True)
+        Address.email = Column(String(50), key='_email')
+        Address.user_id = Column('user_id', Integer, ForeignKey('users.id'),
+                             key='_user_id')
+
+        Base.metadata.create_all()
+
+        assert Address.__table__.c['id'].name == 'id'
+        assert Address.__table__.c['_email'].name == 'email'
+        assert Address.__table__.c['_user_id'].name == 'user_id'
+
+        u1 = User(name='u1', addresses=[
+            Address(email='one'),
+            Address(email='two'),
+        ])
+        sess = create_session()
+        sess.save(u1)
+        sess.flush()
+        sess.clear()
+
+        self.assertEquals(sess.query(User).all(), [User(name='u1', addresses=[
+            Address(email='one'),
+            Address(email='two'),
+        ])])
+
+        a1 = sess.query(Address).filter(Address.email=='two').one()
+        self.assertEquals(a1, Address(email='two'))
+        self.assertEquals(a1.user, User(name='u1'))
+
+
     @testing.emits_warning('Ignoring declarative-like tuple value of '
                            'attribute id')
     def test_oops(self):
@@ -117,10 +158,9 @@ class DeclarativeTest(TestBase):
 
         Base.metadata.create_all()
 
-        print User.a
-        print User.c
-
         u1 = User(name='u1', a='a', b='b')
+        assert u1.a == 'a'
+        assert User.a.get_history(u1) == (['a'], [], [])
         sess = create_session()
         sess.save(u1)
         sess.flush()