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