I think so.  See, the problem is when you use select_by ( <the
property on table b> = <whatever >), the generated sql appends the
same sql that you would get by using the join_to function.  That in
effect does an inner join and eliminates the extra rows desired in the
result.  The join needs to take place with the "A left join B using
(join clause)" syntax instead.

Thanks
-Dennis

On 9/26/06, Michael Bayer <[EMAIL PROTECTED]> wrote:
> 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
>
>


-- 
You can see what's happening at http://muhlesteins.com

-------------------------------------------------------------------------
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