]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- allow aliased() to call .alias() on a selectable, [ticket:2018]
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 15 Jan 2011 18:48:58 +0000 (13:48 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 15 Jan 2011 18:48:58 +0000 (13:48 -0500)
CHANGES
lib/sqlalchemy/orm/__init__.py
lib/sqlalchemy/orm/util.py
test/orm/test_query.py

diff --git a/CHANGES b/CHANGES
index 1c2ea954eac10d5ae5e05a7da1a084c020147a65..788fff57e606ab18da969b9fa44bfed3f10dd79d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -5,6 +5,10 @@ CHANGES
 =======
 0.7.0b1
 =======
+- orm
+  - the aliased() function, if passed a SQL FromClause element
+    (i.e. not a mapped class), will return element.alias() 
+    instead of raising an error on AliasedClass.  [ticket:2018]
 
 - sql
   - Added NULLS FIRST and NULLS LAST support. It's implemented
index 73b079e0320a226ec8e78d602aafa44cca1f5a6c..ff8c7155c6c8a11f798801eaa9f07e64f2675667 100644 (file)
@@ -29,7 +29,7 @@ from sqlalchemy.orm.interfaces import (
      AttributeExtension,
      )
 from sqlalchemy.orm.util import (
-     AliasedClass as aliased,
+     aliased,
      join,
      object_mapper,
      outerjoin,
index 7866aab2b5a6b0ca268e0b4091d5509c453c53f8..6bcd73e505523c84e91472ecfc0aea1c44e1c7f1 100644 (file)
@@ -285,6 +285,12 @@ class AliasedClass(object):
         return '<AliasedClass at 0x%x; %s>' % (
             id(self), self.__target.__name__)
 
+def aliased(element, alias=None, name=None):
+    if isinstance(element, expression.FromClause):
+        return element.alias(name)
+    else:
+        return AliasedClass(element, alias=alias, name=name)
+
 def _orm_annotate(element, exclude=None):
     """Deep copy the given ClauseElement, annotating each element with the
     "_orm_adapt" flag.
index fba77c7832bdee94b7d20c608fd83af61cc874ba..948d04620ec73c0966073d725f978029ae662ff6 100644 (file)
@@ -626,11 +626,27 @@ class ExpressionTest(QueryTest, AssertsCompiledSQL):
 
     def test_deferred_instances(self):
         session = create_session()
-        s = session.query(User).filter(and_(addresses.c.email_address == bindparam('emailad'), Address.user_id==User.id)).statement
+        s = session.query(User).filter(and_(addresses.c.email_address == bindparam('emailad'), 
+                                        Address.user_id==User.id)).statement
 
         l = list(session.query(User).instances(s.execute(emailad = 'jack@bean.com')))
         eq_([User(id=7)], l)
 
+    def test_aliased_sql_construct(self):
+        j = join(User, Address)
+        a1 = aliased(j)
+        self.assert_compile(
+            a1.select(),
+            "SELECT anon_1.users_id, anon_1.users_name, anon_1.addresses_id, "
+            "anon_1.addresses_user_id, anon_1.addresses_email_address "
+            "FROM (SELECT users.id AS users_id, users.name AS users_name, "
+            "addresses.id AS addresses_id, addresses.user_id AS "
+            "addresses_user_id, addresses.email_address AS "
+            "addresses_email_address FROM users JOIN addresses "
+            "ON users.id = addresses.user_id) AS anon_1",
+            use_default_dialect=True
+        )
+
     def test_scalar_subquery(self):
         session = create_session()