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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---