hi Jeronimo -

eager loading of self-referential relationships is not supported in  
version 0.3.  this is a new feature as of version 0.4, using the  
"join_depth" option to indicate how many levels deep youd like to  
eagerly-join.  in any case, even when eager loading is specified, the  
load should "fall back" to a lazyload if eager loading could not occur.

However, assigning two different classes to the same table, without  
any inheritance identifiers, is also something that has never been  
done before, so additional testing may be needed ensure that works.   
But I would ask if its really necessary to map two different classes  
like that  ?  how do they differ ?

Trying your test with 0.4, and using the "join_depth" option as  
described at http://www.sqlalchemy.org/docs/04/ 
mappers.html#advdatamapping_relation_selfreferential_eagerloading ,  
is worth a try.  If you can use just a single class, that will  
definitely work.  For a description of how self-referential loading  
normally works with 0.4 and (also pretty much with 0.3 as well), see  
http://www.sqlalchemy.org/docs/04/ 
mappers.html#advdatamapping_relation_selfreferential .

hope this helps,

- mike

On Aug 15, 2007, at 12:54 PM, Jeronimo wrote:

>
> Greetengs !!
> I'm having trouble getting a list from a recursive relationship. The
> relation is between NodeA and NodeB, where NodeA whould be the parent
> and NodeB the child.
> If the recursive relatioship is lazy the list is loaded correctly when
> the property is requested, but when child elements need to be loaded
> eagerly the list never loads, even using eagerload option.
>
> -------------------------------------------------------------------
> Test Case:
>
> from sqlalchemy import *
> from sqlalchemy.ext.assignmapper import assign_mapper
> from sqlalchemy.ext.sessioncontext import SessionContext
> from sqlalchemy.ext.selectresults import SelectResults
>
> ctx = SessionContext(create_session)
> session = ctx.current
> metadata = MetaData()
>
> table = Table("node_table", metadata,
>     Column('id', Integer, primary_key=True),
>     Column('number', Unicode(10), nullable=False),
>     Column('parent_id', Integer, ForeignKey('node_table.id'))
> )
>
> class NodeA(object): pass
> class NodeB(object): pass
>
> assign_mapper(ctx, NodeB, table)
> # With lazy=True here the list IS loaded when needed
> assign_mapper(ctx, NodeA, table, properties={'b_childs':
> relation(NodeB, lazy=False)})
>
> metadata.bind = create_engine('sqlite://', echo=True)
> metadata.create_all()
>
> table.insert().execute(number=1)
> table.insert().execute(number=2)
> table.insert().execute(number=3, parent_id=1)
> table.insert().execute(number=4, parent_id=1)
> table.insert().execute(number=5, parent_id=2)
>
> a = SelectResults(session.query(NodeA)).filter(NodeA.c.id==1).list()
> [0]
> # If recursive relationship is lazy b child nodes are loaded, but if
> relationship is not lazy they are never loaded
> # even when using eagerload option
> print a.b_childs
>
> Does anyone knows what's the problem here ? I'm using sqlalchemy
> version 0.3.9.
> Regards !
>
>
> >


--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to