without my completely understanding this (which would require  
reconstructing it and running it), would a query.outerjoin_to('foo')  
solve the problem ?

On Sep 26, 2006, at 12:54 PM, Dennis Muhlestein wrote:

> Sorry, this is long but bear with me :)
>
> I have a rather complex object (a) that can be joined to another
> table/object b in more than one way.  The structure is something like
> this
>
> Table A
>   id int primary key
>   c_id int references c #(c can have lots of a)
>
> Table B
>   a_id int references a
>   c_id int references c
>   primary key (a_id,c_id) #(c can have one (or none) b for each "A"
> whether they own it or not)
>
> C isn't important for this example really.
>
> In my mapper for A, I've added a property (let's say "c_b" for the
> join with the custom primaryjoin and that works just great.
> session.query(A).select_by( ... ) produces the join that I've
> specified:
>   A.mapper.add_property('c_b', relation 
> (B,uselist=False,primaryjoin=and_(
>   a.c.id==b.c.a_id,a.c.c_id==b.c.c_id))
>
> example:
>  select .. from A left outer join B on .... (my join from above)...
> WHERE... etc.
>
> That's all fine.
>
> I need to do the following though:
>
> session.query(A).select ( and_(B.c.otherproperty == None ,
> B.c.otherproperty=false) )
>
> The above statement does not include the outerjoin for A to B.
> Instead, it includes
> FROM A,B WHERE..etc.. which obviously includes too many rows.
>
> Next try:
>
> session.query(A).options(eagerload('c_b')).select ( B.c.otherproperty
> == None , B.c.otherproperty=false )
>
> Result is FROM B,A left outer join B on .... etc  WHERE etc.  (Same
> result as first try)
>
> Alternate try:
>
> session.query(A).select ( or_(B.c.otherproperty == None ,
> B.c.otherproperty=false) & q.join_to('c_a') )
>
> Result returns too few rows because the join is handled manually in
> the where clause with and statements and functions like an inner join
> instead of an outer join.
>
> So.. reverting to the select statement, I can do this:
>
> s=select( [tablea], and_(...correct from
> clause),from_obj=[tablea.outerjoin(tableb, and_(...joinclause...))] )
> alist=A.mapper.instances( s.execute(), session )
>
> And... wallah.. I have the correct list of results.
>
> Well, is there any way to accomplish the last result by using the
> query object's select statement or am I consigned to using the mapper?
>  If I can use the query interface, I don't have to worry about all the
> other join objects in the select statement, and can instead pass
> eagerload options for the properties I need in the query.  It really
> is noticably fewer lines of code and less headache.
>
> Thoughts?
>
> Thanks
> Dennis
>
> ---------------------------------------------------------------------- 
> ---
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to  
> share your
> opinions on IT & business topics through brief surveys -- and earn  
> cash
> http://www.techsay.com/default.php? 
> page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> Sqlalchemy-users mailing list
> Sqlalchemy-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to