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
dgardner <at> creatureshop.com
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "sqlalchemy" group.
To post to this group, send email to sqlalchemy <at> googlegroups.com
To unsubscribe from this group, send email to sqlalchemy+unsubscribe <at> googlegroups.com
For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---