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
-~----------~----~----~----~------~----~------~--~---

Reply via email to