Excerpts from Michael Bayer's message of Wed May 26 13:23:01 -0300 2010:
> 
> On May 26, 2010, at 11:47 AM, Mariano Mara wrote:
> 
> > Hi everyone. I have been working in a little class that brings support
> > for "with recursive" idiom in my project. Actually the part it supports 
> > for the moment are the necessary bits to generate hierarchical data (I
> > thought somebody might find it useful too so I added it as a recipe in
> > the wiki[1]).
> > 
> > The basic idea is that you submit a select expression like (see the wiki
> > for the whole example):
> > 
> > select([category.c.id, category.c.name])
> > 
> > and you will get a query like
> > 
> > with recursive rec as (SELECT category.id, category.name, 1 AS level,
> > ARRAY[id] AS connect_path 
> > FROM category 
> > WHERE coalesce(parent_id, 0) = 0 UNION ALL SELECT category.id,
> > category.name, rec.level + 1 AS level, array_append(rec.connect_path,
> > category.id) AS connect_path 
> > FROM category, rec 
> > WHERE category.parent_id = rec.id) SELECT rec.id, rec.name, rec.level,
> > rec.connect_path, case connect_path <@ lead(connect_path, 1) over (order
> > by connect_path) when true then false else true end AS is_leaf 
> > FROM rec order by connect_path
> > 
> > that will give you the same information you requested plus some extra
> > columns with hierarchy related info.
> > 
> > The final piece I'm missing is how to pass a where clause: actually I
> > cannot make the final sql instruction to accept the parameters I'm
> > passing and after hours of trying it seems my sqlalchemy-fu is exhausted
> > and I can't fix it by myself.
> > 
> > To illustrate the problem, this is the select with a where clause:
> > 
> > select([category.c.id, category.c.name], category.c.active==True)
> 
> I dont have time to read all your source but when you say 
> category.c.active==True, you get a structure like:
> 
> _BinaryExpression
>  
> Column('active'),   operator.eq,   _BindParamClause('active_1', value=True)
> 
> the value of that bind maybe could get lost if you aren't compiling the 
> statement fully with the same compiler object.  for example, if you had 
> something like this:
> 
> 
> @compiles(FooBar)
> def compile_foo_bar(element, compiler, **kw):
>     return "FOO BAR " + str(element.value)
> 
> the str(element.value), if that is also a ClauseElement, is going to invoke a 
> whole new compiler with its own set of bind param values.   You don't want to 
> do that.  You want to say:
> 
> @compiles(FooBar)
> def compile_foo_bar(element, compiler, **kw):
>     return "FOO BAR " + compiler.process(element.value)
> 
> thus keeping everything within the same context.   this not only maintains 
> all the binds but also maintains the behavior of the backend being compiled 
> against.
> 
> hope this helps...
> 
For sure it helps, thanks for the pointer. Will try to fix my problem
with it.

Mariano

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@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