]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- relaxed rules on column_property() expressions having labels; any
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 4 Dec 2007 17:06:55 +0000 (17:06 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 4 Dec 2007 17:06:55 +0000 (17:06 +0000)
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().

CHANGES
lib/sqlalchemy/orm/properties.py
lib/sqlalchemy/sql/compiler.py
test/orm/query.py

diff --git a/CHANGES b/CHANGES
index a785ac1a97bacc8ff7f80c4a81a43dd2261adaad..e3ce282cfb6c4972bfbca55d51d3f2aa35adbb91 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -33,6 +33,11 @@ CHANGES
      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(), 
index 806c91a2b7cebea3bfd36486c582b284526fc1a7..8980a4498a7a382e19be5ff153caff045dcbfb1f 100644 (file)
@@ -12,7 +12,7 @@ to handle flush-time dependency sorting and processing.
 """
 
 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
@@ -38,10 +38,8 @@ class ColumnProperty(StrategizedProperty):
         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:
index 9b24dd5213dacfe89c64384fa970b3054c3ffcbc..d94d3fef6755c4f31f5701758ca8817126b56a66 100644 (file)
@@ -438,7 +438,7 @@ class DefaultCompiler(engine.Compiled):
         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 \
index 562b1eee22c6321cbc13ac399e4e7d64173f31de..ef9e3540d5c06019edc450d3fcfe31b1a07b457b 100644 (file)
@@ -948,18 +948,18 @@ class ExternalColumnsTest(QueryTest):
         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={