On Nov 9, 2007, at 11:05 PM, iain duncan wrote:

>
> # many to many of collection-products to products
> collections_products_table = Table('collections_products', metadata,
>    Column('collection_id', Integer, ForeignKey('products.id') ),
>    Column('product_id', Integer, ForeignKey('products.id') ),
>    )
>
> #mapper
> assign_mapper(session.context, Product, product_table, properties={
> 'children': relation( Product, secondary=collections_products_table,
> lazy=True, )
> })
>
>
> or
> assign_mapper(session.context, Product, product_table, properties={
> 'children': relation( Product, secondary=collections_products_table,
> primaryjoin =
> collections_products_table.c.collection_id==product_table.c.id,
> lazy=True ),
> })
>
>
> Neither of the above work. Tg loads ok but when I try to make a  
> product
> I get the following:
>
> ArgumentError: Error determining primary and/or secondary join for
> relationship 'children' between mappers 'Mapper|Product|products' and
> 'Mapper|Product|products'.  If the underlying error cannot be  
> corrected,
> you should specify the 'primaryjoin' (and 'secondaryjoin', if there is
> an association table present) keyword arguments to the relation()
> function (or for backrefs, by specifying the backref using the  
> backref()
> function with keyword arguments) to explicitly specify the join
> conditions.  Nested error is "Cant determine join between 'products'  
> and
> 'collections_products'; tables have more than one foreign key  
> constraint
> relationship between them.  Please specify the 'onclause' of this join
> explicitly."
>

OK this is what happens here, the relationship you want to establish is:

product_table  ----(product_table.id=collections.parent_id)--->  
collections ----(collections.child_id=product_table.id)---->  
product_table

so above, youve got product_table.id, youve got the collections table  
(secondary), and youve got the primary join although i think you mean  
for it to be  
"primaryjoin 
=collections_products_table.c.parent_id==product_table.c.id".     the  
mapper also needs you to give it the secondaryjoin,  
"secondaryjoin 
=collections_products_table.c.collection_id==product_table.c.id",  
because it sees that there is more than one way to make a join between  
"products" and "collections" so it cant go any further (you could say  
that it should use the process of elimination since you gave it the  
primaryjoin, but thats a topic for another discussion :)  ).  so setup  
primaryjoin and secondaryjoin and youre good to go.

- mike




--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to