The problem I'm running into is what to pass into contains_eager(). In 
my table I'm mapping a file system, Asset.path is a unique constraint, 
so my outerjoin() will either find a single row or none.

When I do:
--------------------
scn_alias=aliased(Asset)
p='testshow/eps/201/s22/t04'
take = session.query(Asset).filter(Asset.path==p).\
       outerjoin((scn_alias,scn_alias.path=="%s/anim/scn"%p)).\
       options(contains_eager(Asset,alias=scn_alias)).one()   
-----------------------
I get:
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
  File "/usr/lib/pymodules/python2.5/sqlalchemy/orm/query.py", line 602, 
in options
    return self.__options(False, *args)
  File "<string>", line 1, in <lambda>
  File "/usr/lib/pymodules/python2.5/sqlalchemy/orm/query.py", line 52, 
in generate
    fn(self, *args[1:], **kw)
  File "/usr/lib/pymodules/python2.5/sqlalchemy/orm/query.py", line 619, 
in __options
    opt.process_query(self)
  File "/usr/lib/pymodules/python2.5/sqlalchemy/orm/interfaces.py", line 
655, in process_query
    self._process(query, True)
  File "/usr/lib/pymodules/python2.5/sqlalchemy/orm/interfaces.py", line 
661, in _process
    paths = self.__get_paths(query, raiseerr)
  File "/usr/lib/pymodules/python2.5/sqlalchemy/orm/interfaces.py", line 
719, in __get_paths
    raise sa_exc.ArgumentError("mapper option expects string key or list 
of attributes")
sqlalchemy.exc.ArgumentError: mapper option expects string key or list 
of attributes



Michael Bayer wrote:
> On May 1, 2009, at 2:55 PM, David Gardner wrote:
>
>   
>> Along those same lines, one of the things I would like to do is to  
>> do an arbitrary join, my table is hierarchical and often I want to  
>> do a join against a a node, along with another node two levels deep  
>> below it, and since its a tree structure eager loading all of the  
>> children, and grandchildren would be costly, when I only care about  
>> two of them.
>>
>> So I have this:
>>
>> scn_alias=aliased(Asset)
>> p='testshow/eps/201/s22/t04'
>>
>> take = session.query(Asset).filter(Asset.path==p).\
>>         outerjoin((scn_alias,scn_alias.path=="%s/anim/ 
>> scn"%p),aliased=True).one()
>>
>> This produces the correct SQL, but since scn_alias isn't directly  
>> mapped as a relation to the row I am querying, I can't figure out  
>> the correct arguments to pass to contains_eager().
>>     
>
> contains_eager just needs to know what columns in the selectable it  
> needs to draw from.   so again here, drop the aliased=True since  
> scn_alias is already an alias, then pass scn_alias as the "alias"  
> keyword to contains_eager().  Also your outerjoin should probably be  
> qualified against the parent Asset object otherwise you're in danger  
> of cartesian products.
>
>
>
> >
>
>   


-- 
David Gardner
Pipeline Tools Programmer, "Sid the Science Kid"
Jim Henson Creature Shop
[email protected]


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