]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- fixed error where Query.add_column() would not accept a class-bound
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 9 Nov 2007 16:36:46 +0000 (16:36 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 9 Nov 2007 16:36:46 +0000 (16:36 +0000)
attribute as an argument; Query also raises an error if an invalid
argument was sent to add_column() (at instances() time) [ticket:858]

CHANGES
lib/sqlalchemy/orm/query.py
test/orm/query.py

diff --git a/CHANGES b/CHANGES
index b6a9024e96bdf87a4a41d7aa4394c2143648c803..63bbf71f5bf30e4dab953c76008ab87420331341 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -73,7 +73,11 @@ CHANGES
 
   - query doesn't throw an error if you use distinct() and an order_by()
     containing UnaryExpressions (or other) together [ticket:848]
-    
+
+  - fixed error where Query.add_column() would not accept a class-bound
+    attribute as an argument; Query also raises an error if an invalid
+    argument was sent to add_column() (at instances() time) [ticket:858]
+        
   - The session API has been solidified:
 
     - It's an error to session.save() an object which is already
index 753e735d1d965c3f1ec3630f735f58e0f1f4e8de..300d4a5496459a8ef4eb1af9c97d4e7e12ef79f3 100644 (file)
@@ -240,6 +240,10 @@ class Query(object):
         
         q = self._clone()
 
+        # duck type to get a ClauseElement
+        if hasattr(column, 'clause_element'):
+            column = column.clause_element()
+        
         # alias non-labeled column elements. 
         if isinstance(column, sql.ColumnElement) and not hasattr(column, '_label'):
             column = column.label(None)
@@ -682,6 +686,9 @@ class Query(object):
                             res.append(row_adapter(row)[m])
                         process.append((proc, res))
                     y(m)
+                else:
+                    raise exceptions.InvalidRequestError("Invalid column expression '%r'" % m)
+                    
             result = []
         else:
             result = util.UniqueAppender([])
index a8790d2cfa2af65966a5630949021cd8e560f1e1..e736d49e4be1fd54ef3b79d89161e89f9915f4fa 100644 (file)
@@ -721,8 +721,24 @@ class InstancesTest(QueryTest):
         assert l == [(user8, address3)]
 
     def test_multi_columns(self):
+        sess = create_session()
+
+        expected = [(u, u.name) for u in sess.query(User).all()]
+        
+        for add_col in (User.name, users.c.name, User.c.name):
+            assert sess.query(User).add_column(add_col).all() == expected
+
+        try:
+            sess.query(User).add_column(object()).all()
+            assert False
+        except exceptions.InvalidRequestError, e:
+            assert "Invalid column expression" in str(e)
+            
+        
+    def test_multi_columns_2(self):
         """test aliased/nonalised joins with the usage of add_column()"""
         sess = create_session()
+
         (user7, user8, user9, user10) = sess.query(User).all()
         expected = [(user7, 1),
             (user8, 3),
@@ -740,7 +756,8 @@ class InstancesTest(QueryTest):
         q = sess.query(User)
         l = q.add_column("count").from_statement(s).all()
         assert l == expected
-
+    
+        
     def test_two_columns(self):
         sess = create_session()
         (user7, user8, user9, user10) = sess.query(User).all()