On Nov 6, 2009, at 7:53 PM, David Gardner wrote:

>
> CREATE TABLE task (
> "name" text NOT NULL,
> asset text NOT NULL,
> parent_asset text,
> <more columns>
> CONSTRAINT "task_PK" PRIMARY KEY (asset, name),
> CONSTRAINT "task_parent_FK" FOREIGN KEY (parent_asset, "name")
>      REFERENCES task (asset, "name") MATCH SIMPLE
>      ON UPDATE CASCADE ON DELETE CASCADE);
>
> So I define my mapper like:
> mapper(Task,task_table, properties={
>       'Children' : relation(Task, backref=backref('Parent',
>
> remote_side=[task_table.c.asset, task_table.c.name]),
>
> order_by=task_table.c.asset,cascade='all', lazy=True)
>       })
>
> the problem is when I do:
>
> task=session.query(Task).options(eagerload(Task.Children)).get 
> (('test_project','test_task'))
>
> produces this in SQL:
> SELECT <columns>
> FROM task LEFT OUTER JOIN task AS task_1 ON task.asset =
> task_1.parent_asset AND task.name = task.name
> WHERE task.asset = %(param_1)s AND task.name = %(param_2)s ORDER BY
> task_1.asset

Theres a test case like this which had a behavioral change as of  
0.5.5, but looking at that, eager loading doesn't come into the picture.

for that particular test, we add foreign_keys=[task.c.parent_asset] to  
the many to one side, and foreign_keys=[None] to the one-to-many  
side.  You might need that here just in general.

But for eagerloading I actually don't think we have a solution for  
that right now.   the "task_1" comes into the ON clause by way of  
clause adaption, which has a list of columns that it wants to  
"adapt".   So "task.name" is either in or not in the list.

I'm thinking of a completely bizarre hack which would be to add a  
Column to the table with the same name as "name", but a different key,  
then setting up primaryjoin using that.   But I don't know if that  
would do it.

Otherwise you might just take the easy route and say:

t2 = aliased(Task)
s.query(Task).join(t2, and_(Task.parent_asset==t2.asset,  
Task.name==t2.name)).options(contains_eager("parent" , alias=t2))




--~--~---------~--~----~------------~-------~--~----~
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 
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to