From: Mike Bayer Date: Tue, 18 Mar 2008 02:38:11 +0000 (+0000) Subject: mapper double checks that columns in _compile_property are in the _cols_by_table... X-Git-Tag: rel_0_4_5~80 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3d5a852b1d1300310f8db47a000305bf55a28e0e;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git mapper double checks that columns in _compile_property are in the _cols_by_table collection --- diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 15fab08166..55dcabd32e 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -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) diff --git a/test/ext/declarative.py b/test/ext/declarative.py index 44f34cb446..4cddd684fa 100644 --- a/test/ext/declarative.py +++ b/test/ext/declarative.py @@ -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()