wouldn't this be accomplished more simply using contains_eager() ? On Mar 31, 2009, at 9:12 AM, Bob Farrell wrote:
> > 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 -~----------~----~----~----~------~----~------~--~---