summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES4
-rw-r--r--lib/sqlalchemy/orm/__init__.py2
-rw-r--r--lib/sqlalchemy/orm/util.py6
-rw-r--r--test/orm/test_query.py18
4 files changed, 28 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index 1c2ea954e..788fff57e 100644
--- 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
diff --git a/lib/sqlalchemy/orm/__init__.py b/lib/sqlalchemy/orm/__init__.py
index 73b079e03..ff8c7155c 100644
--- a/lib/sqlalchemy/orm/__init__.py
+++ b/lib/sqlalchemy/orm/__init__.py
@@ -29,7 +29,7 @@ from sqlalchemy.orm.interfaces import (
AttributeExtension,
)
from sqlalchemy.orm.util import (
- AliasedClass as aliased,
+ aliased,
join,
object_mapper,
outerjoin,
diff --git a/lib/sqlalchemy/orm/util.py b/lib/sqlalchemy/orm/util.py
index 7866aab2b..6bcd73e50 100644
--- a/lib/sqlalchemy/orm/util.py
+++ b/lib/sqlalchemy/orm/util.py
@@ -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.
diff --git a/test/orm/test_query.py b/test/orm/test_query.py
index fba77c783..948d04620 100644
--- a/test/orm/test_query.py
+++ b/test/orm/test_query.py
@@ -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()