From: Mike Bayer Date: Sat, 15 Jan 2011 18:48:58 +0000 (-0500) Subject: - allow aliased() to call .alias() on a selectable, [ticket:2018] X-Git-Tag: rel_0_7b1~75 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=39c79c039c8feb89bab1fd389eb4844988414838;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - allow aliased() to call .alias() on a selectable, [ticket:2018] --- diff --git a/CHANGES b/CHANGES index 1c2ea954ea..788fff57e6 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 73b079e032..ff8c7155c6 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 7866aab2b5..6bcd73e505 100644 --- a/lib/sqlalchemy/orm/util.py +++ b/lib/sqlalchemy/orm/util.py @@ -285,6 +285,12 @@ class AliasedClass(object): return '' % ( 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 fba77c7832..948d04620e 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()