> > I have the following code: > > > class EventQuery(Query): > > def histogram(self): > > ''' return a histogram of source / count(source) given an eventquery'' > > ... > > ... > > > class Event(Base): > > __tablename__ = 'events' > > query = Session.query_property(query_cls = EventQuery) > > name = Column(Unicode(128)) > > source = Column(BigInteger) > > ... > > > Now, Event has 54 additional attributes, some of which are quite large. In > > EventQuery.histogram(), all I really need is the Event.source attribute. > > 'events' has over 150 million rows, and it's likely that > > EventQuery.histogram() will be called for all events. > > > So - is there any way to 'modify' the query (self) in histogram() so that > > it only returns (Event.source, func.count(Event.source)), or, for the > > general case, to modify the query to return an attribute of the object? > > I've tried from_self, but that seems highly inefficient (at least 20x > > slower than Session.query(...) ). I'd also really like to keep histogram() > > as a method of EventQuery. > > > I can see reasons why this would be impossible, but perhaps there's a way > > to do it. > > you can use values(Event.source, func.count(...)), or just put a method on > Event called "histogram" that uses the standard > object_session(self).query(...) approach, I'm not really sure what the using > the old "query_property" accessor gets you here >
Thanks, Michael. Two followup questions: 1) The histogram() method is designed to provide statistics on a set of Events (defined by a query), so it made sense (to me) to make it a method of EventQuery. I don't know how I'd do this as a method of Event. Could you clarify? 2) When you say 'old "query property"' accessor, are you implying that query_property is deprecated? Is there an alternative? I really like the idea of subclassing Query and adding custom methods. Is this a misguided approach? BTW: the values() generator takes at least as long as the from_self() does, and uses a huge amount of memory since all().values() still passes the entire object list to python. from_self() took 1920 seconds to run against the entire 'events' table, where Session.query(func.distinct(Event.source)).all() took 0.02 seconds. I'll try experimenting with joins next. Thanks, S. -- 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.
