mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-06-03 06:19:59 -04:00
- When using Query.join() with an explicit clause for the
ON clause, the clause will be aliased in terms of the left side of the join, allowing scenarios like query(Source). from_self().join((Dest, Source.id==Dest.source_id)) to work properly.
This commit is contained in:
@@ -23,6 +23,12 @@ CHANGES
|
||||
the "please specify primaryjoin" message when determining
|
||||
join condition.
|
||||
|
||||
- When using Query.join() with an explicit clause for the
|
||||
ON clause, the clause will be aliased in terms of the left
|
||||
side of the join, allowing scenarios like query(Source).
|
||||
from_self().join((Dest, Source.id==Dest.source_id)) to work
|
||||
properly.
|
||||
|
||||
- polymorphic_union() function respects the "key" of each
|
||||
Column if they differ from the column's name.
|
||||
|
||||
|
||||
@@ -885,8 +885,12 @@ class Query(object):
|
||||
onclause = right_adapter.traverse(onclause)
|
||||
|
||||
if prop:
|
||||
# MapperProperty based onclause
|
||||
onclause = prop
|
||||
|
||||
else:
|
||||
# ClauseElement based onclause
|
||||
onclause = self._adapt_clause(onclause, False, True)
|
||||
|
||||
clause = orm_join(clause, right_entity, onclause, isouter=outerjoin)
|
||||
if alias_criterion:
|
||||
self._filter_aliases = right_adapter
|
||||
|
||||
@@ -379,7 +379,7 @@ class _ORMJoin(expression.Join):
|
||||
else:
|
||||
onclause = pj
|
||||
self._target_adapter = target_adapter
|
||||
|
||||
|
||||
expression.Join.__init__(self, left, right, onclause, isouter)
|
||||
|
||||
def join(self, right, onclause=None, isouter=False):
|
||||
|
||||
@@ -976,6 +976,24 @@ class JoinTest(QueryTest):
|
||||
[('jack',)]
|
||||
)
|
||||
|
||||
# explicit onclause with from_self(), means
|
||||
# the onclause must be aliased against the query's custom
|
||||
# FROM object
|
||||
self.assertEquals(
|
||||
sess.query(User).offset(2).from_self().join(
|
||||
(Order, User.id==Order.user_id)
|
||||
).all(),
|
||||
[User(name='fred')]
|
||||
)
|
||||
|
||||
# same with an explicit select_from()
|
||||
self.assertEquals(
|
||||
sess.query(User).select_from(select([users]).offset(2).alias()).join(
|
||||
(Order, User.id==Order.user_id)
|
||||
).all(),
|
||||
[User(name='fred')]
|
||||
)
|
||||
|
||||
|
||||
def test_aliased_classes(self):
|
||||
sess = create_session()
|
||||
|
||||
Reference in New Issue
Block a user