from sqlalchemy.orm import util as mapperutil
import operator
from sqlalchemy.orm.interfaces import StrategizedProperty, PropComparator
+from sqlalchemy.exceptions import ArgumentError
__all__ = ['ColumnProperty', 'CompositeProperty', 'PropertyLoader', 'BackRef']
self.group = kwargs.pop('group', None)
self.deferred = kwargs.pop('deferred', False)
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)
def create_strategy(self):
if self.deferred:
def setup_mappers(self):
pass
- def test_external_columns(self):
- """test querying mappings that reference external columns or selectables."""
-
- f = (users.c.id *2).label('concat')
+ def test_external_columns_bad(self):
+ """test that SA catches some common mis-configurations of external columns."""
+ f = (users.c.id * 2)
try:
mapper(User, users, properties={
'concat': f,
class_mapper(User)
except exceptions.ArgumentError, e:
assert str(e) == "Column '%s' is not represented in mapper's table. Use the `column_property()` function to force this column to be mapped as a read-only attribute." % str(f)
+ else:
+ raise 'expected ArgumentError'
clear_mappers()
+ try:
+ mapper(User, users, properties={
+ 'concat': column_property(users.c.id * 2),
+ })
+ except exceptions.ArgumentError, e:
+ assert str(e) == 'ColumnProperties must be named for the mapper to work with them. Try .label() 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(f),
+ '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'))
})