[sqlalchemy] Re: joining to child, and using child in relation

2009-01-29 Thread GHZ

Tested with trunk.  Works, thanks.

On Jan 29, 6:42 am, Michael Bayer  wrote:
> OK, well that was painful but we are stronger for the effort, thanks  
> for bringing up the issue.  r5740 of trunk will allow your original  
> mapper(A.join(B))->mapper(B) to configure properly.
>
> On Jan 28, 2009, at 11:28 PM, Michael Bayer wrote:
>
>
>
> > a join is of the form:
>
> > table1.join(table2, onclause)
>
> > such as
>
> > subscriber_table.join(address_table,
> >    and_(address_table.c.subscriber_id==subscriber.c.id,
> > address_table.c.type=='MAIN'))
>
> > but unfortunately current relation() code does not support a join of  
> > X/
> > Y to Y, unless the join of X/Y is assembled via joined table
> > inheritance.    As a workaround, you can wrap your join() in an
> > aliased select().   A fix may be available in the next 10 minutes or
> > maybe not.
>
> > You also could forego the complexity of mapping to a join and just
> > modify your Subscriber class to break up the "addresses" collection
> > amongst a proxy of the "MAIN" element and a list of the remaining
> > elements.  an attribute_mapped_collection could help to accomplish
> > this nicely.
>
> > On Jan 28, 2009, at 7:22 PM, GHZ wrote:
>
> >> I have a subscriber and address table.
>
> >> a subscriber will have one and only one 'MAIN' address.
> >> I want the subscriber and MAIN address to be represented by one class
> >> 'Subscriber'.  However, I want that class to have a collection
> >> 'addresses' which contains other addresses (e.g. old addresses) - (it
> >> can include the 'MAIN' address too .. or not.. I don't care)
>
> >>   subscriber_table = Table('subscriber', metadata,
> >>       Column('id', primary_key=True),
> >>       autoload=True)
>
> >>   address_table = Table('address',
> >>                         metadata,
> >>                         Column('subscriber_id', ForeignKey
> >> ('subscriber.id'), primary_key=True),
> >>                         Column('address_type', primary_key=True),
> >>                         autoload=True)
>
> >>    subscriber_with_default_address = sql.join( subscriber_table.c.id
> >> == address_table.c.subscriber_id).??? <- something to say
> >> address_table.type is 'MAIN'
>
> >>    mapper(Address, address_table)
>
> >> mapper(Subscriber, subscriber_and_address, properties={
> >>   'id':[subscriber_table.c.id, address_table.c.subscriber_id],
> >>   'addresses' : relation(Address, collection_class=Addresses,
> >> backref='customer')
> >>   })
>
> >> a) I can't quite figure out how to say (address.type is default)
> >> b) even without this I get:
>
> >> sqlalchemy.exc.ArgumentError: Can't determine relation direction for
> >> relationshi
> >> p 'Subscriber.addresses' - foreign key columns are present in both  
> >> the
> >> parent an
> >> d the child's mapped tables.  Specify 'foreign_keys' argument.
>
> >> if I do specify foreign_keys parameter to the relation function, then
> >> I still get the same.
>
> >> Thanks
--~--~-~--~~~---~--~~
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
-~--~~~~--~~--~--~---



[sqlalchemy] Re: joining to child, and using child in relation

2009-01-28 Thread Michael Bayer

OK, well that was painful but we are stronger for the effort, thanks  
for bringing up the issue.  r5740 of trunk will allow your original  
mapper(A.join(B))->mapper(B) to configure properly.


On Jan 28, 2009, at 11:28 PM, Michael Bayer wrote:

>
>
> a join is of the form:
>
> table1.join(table2, onclause)
>
> such as
>
> subscriber_table.join(address_table,
>   and_(address_table.c.subscriber_id==subscriber.c.id,
> address_table.c.type=='MAIN'))
>
> but unfortunately current relation() code does not support a join of  
> X/
> Y to Y, unless the join of X/Y is assembled via joined table
> inheritance.As a workaround, you can wrap your join() in an
> aliased select().   A fix may be available in the next 10 minutes or
> maybe not.
>
> You also could forego the complexity of mapping to a join and just
> modify your Subscriber class to break up the "addresses" collection
> amongst a proxy of the "MAIN" element and a list of the remaining
> elements.  an attribute_mapped_collection could help to accomplish
> this nicely.
>
>
>
> On Jan 28, 2009, at 7:22 PM, GHZ wrote:
>
>>
>> I have a subscriber and address table.
>>
>> a subscriber will have one and only one 'MAIN' address.
>> I want the subscriber and MAIN address to be represented by one class
>> 'Subscriber'.  However, I want that class to have a collection
>> 'addresses' which contains other addresses (e.g. old addresses) - (it
>> can include the 'MAIN' address too .. or not.. I don't care)
>>
>>   subscriber_table = Table('subscriber', metadata,
>>   Column('id', primary_key=True),
>>   autoload=True)
>>
>>   address_table = Table('address',
>> metadata,
>> Column('subscriber_id', ForeignKey
>> ('subscriber.id'), primary_key=True),
>> Column('address_type', primary_key=True),
>> autoload=True)
>>
>>
>>
>>subscriber_with_default_address = sql.join( subscriber_table.c.id
>> == address_table.c.subscriber_id).??? <- something to say
>> address_table.type is 'MAIN'
>>
>>mapper(Address, address_table)
>>
>> mapper(Subscriber, subscriber_and_address, properties={
>>   'id':[subscriber_table.c.id, address_table.c.subscriber_id],
>>   'addresses' : relation(Address, collection_class=Addresses,
>> backref='customer')
>>   })
>>
>> a) I can't quite figure out how to say (address.type is default)
>> b) even without this I get:
>>
>> sqlalchemy.exc.ArgumentError: Can't determine relation direction for
>> relationshi
>> p 'Subscriber.addresses' - foreign key columns are present in both  
>> the
>> parent an
>> d the child's mapped tables.  Specify 'foreign_keys' argument.
>>
>> if I do specify foreign_keys parameter to the relation function, then
>> I still get the same.
>>
>> Thanks
>>
>>
>>>
>
>
> >


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



[sqlalchemy] Re: joining to child, and using child in relation

2009-01-28 Thread Michael Bayer


a join is of the form:

table1.join(table2, onclause)

such as

subscriber_table.join(address_table,
and_(address_table.c.subscriber_id==subscriber.c.id,  
address_table.c.type=='MAIN'))

but unfortunately current relation() code does not support a join of X/ 
Y to Y, unless the join of X/Y is assembled via joined table  
inheritance.As a workaround, you can wrap your join() in an  
aliased select().   A fix may be available in the next 10 minutes or  
maybe not.

You also could forego the complexity of mapping to a join and just  
modify your Subscriber class to break up the "addresses" collection  
amongst a proxy of the "MAIN" element and a list of the remaining  
elements.  an attribute_mapped_collection could help to accomplish  
this nicely.



On Jan 28, 2009, at 7:22 PM, GHZ wrote:

>
> I have a subscriber and address table.
>
> a subscriber will have one and only one 'MAIN' address.
> I want the subscriber and MAIN address to be represented by one class
> 'Subscriber'.  However, I want that class to have a collection
> 'addresses' which contains other addresses (e.g. old addresses) - (it
> can include the 'MAIN' address too .. or not.. I don't care)
>
>subscriber_table = Table('subscriber', metadata,
>Column('id', primary_key=True),
>autoload=True)
>
>address_table = Table('address',
>  metadata,
>  Column('subscriber_id', ForeignKey
> ('subscriber.id'), primary_key=True),
>  Column('address_type', primary_key=True),
>  autoload=True)
>
>
>
> subscriber_with_default_address = sql.join( subscriber_table.c.id
> == address_table.c.subscriber_id).??? <- something to say
> address_table.type is 'MAIN'
>
> mapper(Address, address_table)
>
> mapper(Subscriber, subscriber_and_address, properties={
>'id':[subscriber_table.c.id, address_table.c.subscriber_id],
>'addresses' : relation(Address, collection_class=Addresses,
> backref='customer')
>})
>
> a) I can't quite figure out how to say (address.type is default)
> b) even without this I get:
>
> sqlalchemy.exc.ArgumentError: Can't determine relation direction for
> relationshi
> p 'Subscriber.addresses' - foreign key columns are present in both the
> parent an
> d the child's mapped tables.  Specify 'foreign_keys' argument.
>
> if I do specify foreign_keys parameter to the relation function, then
> I still get the same.
>
> Thanks
>
>
> >


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