On Sep 6, 2012, at 5:07 AM, Ladislav Lenart wrote: > It works! Thank you very much for such a quick response! > > It is a pity I was unable to find it on my own though. I spent several hours > searching and reading various parts of SA documentation and on stackoverflow > - I > am a SQL / SA newbie and there is A LOT to read. But I've read select_from API > documentation now and still don't see any mention of this functionality there. > Is it somewhere? What should I have been googling for to find it quickly in > the > first place?
so, approach #1, q_cte_union.all(), didn't work ? that would be the more direct approach and follows the examples at http://docs.sqlalchemy.org/en/rel_0_7/orm/query.html#sqlalchemy.orm.query.Query.union . for approach #2 the select_from() docs don't have any examples right now to suggest the kinds of things that can go in there (which is of course, anything that represents rows). > > Thank you again, > > Ladislav Lenart > > > On 5.9.2012 18:22, Michael Bayer wrote: >> On Sep 5, 2012, at 9:05 AM, Ladislav Lenart wrote: >> >>> Hello. >>> >>> I have the following example (Base is the usual declarative_base instance): >>> >>> >>> class Node(Base): >>> __tablename__ = 'node' >>> >>> id = Column(Integer(), primary_key=True) >>> parent_id = Column(Integer(), ForeignKey('node.id')) >>> >>> def path(self, root_id): >>> """Query to return a list of nodes once evaluated. >>> It starts with the receiver node and continues upwards to the root. >>> It stops on a node with id root_id. >>> """ >>> q_base = session.query(Node).filter(Node.id == self.id) >>> q_cte = q_base.cte(name='q_cte', recursive=True) >>> q_cte_alias = aliased(q_cte, name='q_cte_alias') >>> node_alias = aliased(Node, name='node_alias') >>> q_rec = session.query(node_alias) >>> q_rec = q_rec.filter(node_alias.id == q_cte_alias.c.parent_id) >>> q_rec = q_rec.filter(node_alias.id != root_id) >>> q_cte_union = q_cte.union_all(q_rec) >>> q = session.query(q_cte_union) >>> return q >>> >>> The above query seems to do what I intend but it returns named tuples and >>> not >>> Node instances. I spent all day searching SA docs but with no luck so far. >>> >>> Is this possible? If so, how? >> >> >> this will probably do what you want if you either a. load the records from >> q_cte_union directly: >> >> q_cte_union.all() >> >> or b. you re-state the query in terms of the entity you want again: >> >> query(Node).select_from(q_cte_union).all() >> >> that is if all goes as planned...ctes and unions are pretty complex under >> the hood. > -- 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.