summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sqlalchemy/orm/properties.py15
-rw-r--r--test/orm/alltests.py1
2 files changed, 13 insertions, 3 deletions
diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py
index db34a9a2a..6e9f9daff 100644
--- a/lib/sqlalchemy/orm/properties.py
+++ b/lib/sqlalchemy/orm/properties.py
@@ -599,13 +599,22 @@ class EagerLoader(LazyLoader):
if hasattr(statement, '_outerjoin'):
towrap = statement._outerjoin
- else:
+ elif isinstance(self.localparent.mapped_table, schema.Table):
+ # if the mapper is against a plain Table, look in the from_obj of the select statement
+ # to join against whats already there.
for (fromclause, finder) in [(x, sql_util.TableFinder(x)) for x in statement.froms]:
- if self.localparent.mapped_table in finder:
+ # dont join against an Alias'ed Select. we are really looking either for the
+ # table itself or a Join that contains the table. this logic still might need
+ # adjustments for scenarios not thought of yet.
+ if not isinstance(fromclause, sql.Alias) and self.localparent.mapped_table in finder:
towrap = fromclause
break
else:
- raise exceptions.InvalidRequestError("EagerLoader cannot locate a clause with which to outer join to, in query '%s'" % str(statement))
+ raise exceptions.InvalidRequestError("EagerLoader cannot locate a clause with which to outer join to, in query '%s' %s" % (str(statement), self.localparent.mapped_table))
+ else:
+ # if the mapper is against a select statement or something, we cant handle that at the
+ # same time as a custom FROM clause right now.
+ towrap = self.localparent.mapped_table
if self.secondaryjoin is not None:
statement._outerjoin = sql.outerjoin(towrap, self.eagersecondary, self.eagerprimary).outerjoin(self.eagertarget, self.eagersecondaryjoin)
diff --git a/test/orm/alltests.py b/test/orm/alltests.py
index 814b2d760..7fcac805a 100644
--- a/test/orm/alltests.py
+++ b/test/orm/alltests.py
@@ -7,6 +7,7 @@ def suite():
'orm.lazytest1',
'orm.eagertest1',
'orm.eagertest2',
+ 'orm.eagertest3',
'orm.sessioncontext',
'orm.unitofwork',