version_id_col is typically set on the base mapper in an inheritance
relationship where it takes effect for all inheriting mappers.
[ticket:883]
+
+ - relaxed rules on column_property() expressions having labels; any
+ ColumnElement is accepted now, as the compiler auto-labels non-labeled
+ ColumnElements now. a selectable, like a select() statement, still
+ requires conversion to ColumnElement via as_scalar() or label().
- several ORM attributes have been removed or made private:
mapper.get_attr_by_column(), mapper.set_attr_by_column(),
"""
from sqlalchemy import sql, schema, util, exceptions, logging
-from sqlalchemy.sql import util as sql_util, visitors, operators
+from sqlalchemy.sql import util as sql_util, visitors, operators, ColumnElement
from sqlalchemy.orm import mapper, sync, strategies, attributes, dependency
from sqlalchemy.orm import session as sessionlib
from sqlalchemy.orm import util as mapperutil
self.comparator = ColumnProperty.ColumnComparator(self)
# sanity check
for col in columns:
- if not hasattr(col, 'name'):
- if hasattr(col, 'label'):
- raise ArgumentError('ColumnProperties must be named for the mapper to work with them. Try .label() to fix this')
- raise ArgumentError('%r is not a valid candidate for ColumnProperty' % col)
+ if not isinstance(col, ColumnElement):
+ raise ArgumentError('column_property() must be given a ColumnElement as its argument. Try .label() or .as_scalar() for Selectables to fix this.')
def create_strategy(self):
if self.deferred:
if isinstance(column, sql._Label):
return column
- if select.use_labels and column._label:
+ if select.use_labels and getattr(column, '_label', None):
return column.label(column._label)
if \
clear_mappers()
try:
mapper(User, users, properties={
- 'concat': column_property(users.c.id * 2),
+ 'count': column_property(select([func.count(addresses.c.id)], users.c.id==addresses.c.user_id).correlate(users))
})
except exceptions.ArgumentError, e:
- assert str(e) == 'ColumnProperties must be named for the mapper to work with them. Try .label() to fix this'
+ assert str(e) == 'column_property() must be given a ColumnElement as its argument. Try .label() or .as_scalar() for Selectables to fix this.'
else:
raise 'expected ArgumentError'
def test_external_columns_good(self):
"""test querying mappings that reference external columns or selectables."""
mapper(User, users, properties={
- 'concat': column_property((users.c.id * 2).label('concat')),
- 'count': column_property(select([func.count(addresses.c.id)], users.c.id==addresses.c.user_id).correlate(users).label('count'))
+ 'concat': column_property((users.c.id * 2)),
+ 'count': column_property(select([func.count(addresses.c.id)], users.c.id==addresses.c.user_id).correlate(users).as_scalar())
})
mapper(Address, addresses, properties={