our_stuff.sort(key=lambda key: our_stuff[key]._creation_order)
# extract columns from the class dict
- cols = []
+ cols = set()
for key, c in our_stuff.iteritems():
if isinstance(c, (ColumnProperty, CompositeProperty)):
for col in c.columns:
- if isinstance(col, Column) and col.table is None:
+ if isinstance(col, Column) and \
+ col.table is None:
_undefer_column_name(key, col)
- cols.append(col)
+ cols.add(col)
elif isinstance(c, Column):
_undefer_column_name(key, c)
- cols.append(c)
+ cols.add(c)
# if the column is the same name as the key,
# remove it from the explicit properties dict.
# the normal rules for assigning column-based properties
# in multi-column ColumnProperties.
if key == c.key:
del our_stuff[key]
+ cols = sorted(cols, key=lambda c:c._creation_order)
table = None
if '__table__' not in dict_:
from test.lib.schema import Table, Column
from sqlalchemy.orm import relationship, create_session, class_mapper, \
joinedload, configure_mappers, backref, clear_mappers, \
- polymorphic_union, deferred, column_property
+ polymorphic_union, deferred, column_property, composite,\
+ Session
from test.lib.testing import eq_
from sqlalchemy.util import classproperty
from test.orm._base import ComparableEntity, MappedTest
self.assert_sql_count(testing.db, go, 1)
+ def test_composite_inline(self):
+ class AddressComposite(ComparableEntity):
+ def __init__(self, street, state):
+ self.street = street
+ self.state = state
+ def __composite_values__(self):
+ return [self.street, self.state]
+
+ class User(Base, ComparableEntity):
+ __tablename__ = 'user'
+ id = Column(Integer, primary_key=True,
+ test_needs_autoincrement=True)
+ address = composite(AddressComposite,
+ Column('street', String(50)),
+ Column('state', String(2)),
+ )
+
+ Base.metadata.create_all()
+ sess = Session()
+ sess.add(User(
+ address=AddressComposite('123 anywhere street',
+ 'MD')
+ ))
+ sess.commit()
+ eq_(
+ sess.query(User).all(),
+ [User(address=AddressComposite('123 anywhere street',
+ 'MD'))]
+ )
+
+ def test_composite_separate(self):
+ class AddressComposite(ComparableEntity):
+ def __init__(self, street, state):
+ self.street = street
+ self.state = state
+ def __composite_values__(self):
+ return [self.street, self.state]
+
+ class User(Base, ComparableEntity):
+ __tablename__ = 'user'
+ id = Column(Integer, primary_key=True,
+ test_needs_autoincrement=True)
+ street = Column(String(50))
+ state = Column(String(2))
+ address = composite(AddressComposite,
+ street, state)
+
+ Base.metadata.create_all()
+ sess = Session()
+ sess.add(User(
+ address=AddressComposite('123 anywhere street',
+ 'MD')
+ ))
+ sess.commit()
+ eq_(
+ sess.query(User).all(),
+ [User(address=AddressComposite('123 anywhere street',
+ 'MD'))]
+ )
+
def test_mapping_to_join(self):
users = Table('users', Base.metadata,
Column('id', Integer, primary_key=True)