select(
[people, engineers.c.description, column("'engineer'").label('type')],
people.c.person_id==engineers.c.person_id)).alias('pjoin')
-
+
# lets print out what this Selectable looks like. The mapper is going to take the selectable and
# Select off of it, with the flag "use_labels" which indicates to prefix column names with the table
# (translation: it'll work)
# TODO: get the eager loading to work (the compound select alias doesnt like being aliased itself)
assign_mapper(Company, companies, properties={
- 'employees': relation(people_mapper, private=True)
+ 'employees': relation(people_mapper, lazy=False, private=True)
})
c = Company(name='company1')
def _instance(self, row, imap, result_list=None):
"""gets an instance from a row, via this EagerLoader's mapper."""
+ # since the EagerLoader makes an Alias of its mapper's table,
+ # we translate the actual result columns back to what they
+ # would normally be into a "virtual row" which is passed to the child mapper.
+ # that way the mapper doesnt have to know about the modified column name
+ # (neither do any MapperExtensions). The row is keyed off the Column object
+ # (which is what mappers use) as well as its "label" (which might be what
+ # user-defined code is using)
fakerow = util.DictDecorator(row)
for c in self.eagertarget.c:
parent = self.target._get_col_by_original(c.original)
fakerow[parent] = row[c]
+ fakerow[parent._label] = row[c]
row = fakerow
return self.mapper._instance(row, imap, result_list)
return BindParamClause(self.table.name + "_" + self.text, obj, shortname = self.text, type=self.type)
def _make_proxy(self, selectable, name = None):
c = ColumnClause(name or self.text, selectable)
+ c._original = self.original
selectable.columns[c.name] = c
return c
def _compare_type(self, obj):