Hello, SQLAlchemy people, So I spoke to jek on IRC to see if there was a way to use add_column without causing the query to return a RowTuple and it doesn't look like there is, so I wrote this:
class AdditiveQuery(Query): """ Extended sqlalchemy.orm.Query class with add_named_column method to add a column onto a query but store the values on the main RowProxy object instead of yielding RowTuples as add_column does: q = AdditiveQuery(FooModel, session=some_session) q = q.join((BarModel, FooModel.x == BarModel.x)) q = q.add_named_column(BarModel.baz, 'bar_baz') for row in q: print q.bar_baz """ def __init__(self, *args, **kwargs): self._named_columns = [] super(AdditiveQuery, self).__init__(*args, **kwargs) def add_named_column(self, column, alias=None): if alias is None: alias = column.key if alias in self._named_columns: raise ValueError("Alias <%s> already in use." % (alias,)) self._named_columns.append(alias) return self.add_column(column) def __iter__(self): def g(it): checked = False for rows in it: row = rows[0] rest = rows[1:] for alias, value in zip(self._named_columns, rest): if not checked and hasattr(row, alias): raise ValueError("Alias <%s> already exists on " "original row object." % (alias,)) setattr(row, alias, value) yield row checked = True it = super(AdditiveQuery, self).__iter__() return g(it) The only immediate issue I can think of with this is that if you do AdditiveQuery(FooModel, BarModel) then this is going to blow up as it'll try to call setattr on a RowTuple - I'm not sure whether to a) just let this happen, b) take preventative measures and raise a more useful exception, c) allow specifying exactly which entity to attach the named_column onto. Any suggestions welcome and, of course, if any of the SA boys want to stick this into SQLAlchemy, you're more than welcome. Thanks ! --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---