From 7bb91d034f2460b180381f835a487854a1d96451 Mon Sep 17 00:00:00 2001 From: Michael Trier Date: Sat, 18 Apr 2009 15:35:07 +0000 Subject: [PATCH] Fixed adding of deferred or othe column properties to a declarative class. --- CHANGES | 5 +++++ lib/sqlalchemy/ext/declarative.py | 6 ++++++ test/ext/declarative.py | 25 ++++++++++++++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index af211a9901..a2dfd7af74 100644 --- a/CHANGES +++ b/CHANGES @@ -68,6 +68,11 @@ CHANGES - Corrected the float type so that it correctly maps to a SLFloat type when being reflected. [ticket:1273] +- extensions + + - Fixed adding of deferred or other column properties to a + declarative class. [ticket:1379] + 0.5.3 ===== - orm diff --git a/lib/sqlalchemy/ext/declarative.py b/lib/sqlalchemy/ext/declarative.py index 084ec2699a..e22928b487 100644 --- a/lib/sqlalchemy/ext/declarative.py +++ b/lib/sqlalchemy/ext/declarative.py @@ -552,6 +552,12 @@ class DeclarativeMeta(type): _undefer_column_name(key, value) cls.__table__.append_column(value) cls.__mapper__.add_property(key, value) + elif isinstance(value, ColumnProperty): + for col in value.columns: + if isinstance(col, Column) and col.table is None: + _undefer_column_name(key, col) + cls.__table__.append_column(col) + cls.__mapper__.add_property(key, value) elif isinstance(value, MapperProperty): cls.__mapper__.add_property(key, _deferred_relation(cls, value)) else: diff --git a/test/ext/declarative.py b/test/ext/declarative.py index c6d4fe6814..0c835641fb 100644 --- a/test/ext/declarative.py +++ b/test/ext/declarative.py @@ -4,7 +4,7 @@ from sqlalchemy.ext import declarative as decl from sqlalchemy import exc from testlib import sa, testing from testlib.sa import MetaData, Table, Column, Integer, String, ForeignKey, ForeignKeyConstraint, asc, Index -from testlib.sa.orm import relation, create_session, class_mapper, eagerload, compile_mappers, backref, clear_mappers, polymorphic_union +from testlib.sa.orm import relation, create_session, class_mapper, eagerload, compile_mappers, backref, clear_mappers, polymorphic_union, deferred from testlib.testing import eq_ from orm._base import ComparableEntity, MappedTest @@ -1082,6 +1082,29 @@ class DeclarativeInheritanceTest(DeclarativeTestBase): Engineer(name="vlad", primary_language="cobol") ) + def test_add_deferred(self): + class Person(Base, ComparableEntity): + __tablename__ = 'people' + id = Column('id', Integer, primary_key=True) + + Person.name = deferred(Column(String(10))) + + Base.metadata.create_all() + sess = create_session() + p = Person(name='ratbert') + + sess.add(p) + sess.flush() + sess.expunge_all() + eq_( + sess.query(Person).all(), + [ + Person(name='ratbert') + ] + ) + person = sess.query(Person).filter(Person.name == 'ratbert').one() + assert 'name' not in person.__dict__ + def test_single_fksonsub(self): """test single inheritance with a foreign key-holding column on a subclass. -- 2.47.2