you can either make the "R" table the "secondary" table between A and  
B, as well as B and C, which would have the effect of always having a  
null value in at least one column of "R", or you can use the existing  
technique and use python property tricks to make the task easier:

class A(object):
     def __init__(self):
         self.relation = ABCRelation()
     def _get_b(self):
         return self.relation.b
     def _set_b(self, b):
         self.relation.b = b
     related_b = property(_get_b, _set_b)
     def _get_c(self):
         return self.relation.c
     def _set_b(self, c):
         self.relation.c = c
     related_c = property(_get_c, _set_c)

On Sep 27, 2006, at 2:05 PM, Martin Kaffanke wrote:

> Am Mittwoch, den 27.09.2006, 13:39 -0400 schrieb Michael Bayer:
>> first off, note that this style of relationship is severely limited
>> with regards to the arrangements of A->B->C.  the C's attached to B's
>> are intertwined with the B's that are attached to A's and it will be
>> very confusing to manage those relationships independently of each
>> other.  if you are looking for select efficiency, you would probably
>> be better off just doing normal joins from A->B->C including
>> association tables if they are many-to-many relationships; SA can
>> eager load such a relationship in one query.
>
> Ok, I hope that helps out. because now I found out, that there is -
> based on given data - not really a need to have an entry in B, an A  
> can
> have a C without an B, thats because People may not want to tell us B
> but only C.
>
>> anyway, the closest SA can get to this is to represent your "R" table
>> as a relationship object with its own mapper:
>>
>> class ABCRelation(object):pass
>>
>> mapper(A, Atable)
>> mapper(B,Btable)
>> mapper(C,Ctable)
>> mapper(ABCRelation, Rtable, primary_key=[R.c.a_id, R.c.b_id,
>> R.c.c_id], properties={
>>              'as':relation(A, backref='relations'),
>>              'bs':relation(B, backref='relations'),
>>              'cs':relation(C, backref='relations')
>>      }, allow_null_pks=True)
>>
>> a = A()
>> b = B()
>> c = C()
>> r = ABCRelation()
>> r.a = a
>> r.b = b
>> r.c = c
>> [session.save(x) for x in [a,b,c,r]]
>> session.flush()
>
> Ok, I see.  But so I have to update many objects.  It is sure, that  
> all
> the objects depend somehow on A.  So I thought on an other Structure
> like doing:
>
> A.B.C # normal relation
> A.C   # if we have no B, but if we have a B A.C and A.B.C are refer to
> the same object.
>
> Can this be done?
>
> Martin
>
>> etc
>>
>> the good news is that the latest trunk of SQLAlchemy (i.e. release
>> 0.2.9) will even keep it straight if you delete an ABCRelation and
>> create a new one with the same relationships in one session; it will
>> turn the DELETE/INSERT into an UPDATE.
>>
>>
>>
>> On Sep 27, 2006, at 1:10 PM, Martin Kaffanke wrote:
>>
>>> Hi there!
>>>
>>> I don't know if my english is good enaugh to tell you what I want.
>>>
>>> I have 3 Tables, lets tell them A, B and C.  The relations:
>>>
>>> An A kann have some B's and a B can have some C's.  But the main
>>> Select
>>> will be:
>>>
>>> and_(A.c.a_id==B.c.a_id, B.c.b_id==C.c.b_id, C.c.c_id=some_integer)
>>>
>>> So now there are two joins.
>>> As you see, we have two joins.  We would have only one by doing
>>>
>>> A B C and a R table, where R has all three ID's:
>>>
>>> R.c.a_id
>>> R.c.b_id
>>> R.c.c_id
>>>
>>> A relation table...
>>>
>>> and_(A.c.a_id==R.c.a_id, C.c.c_id==some_integer)
>>>
>>> would be enaught.
>>>
>>> But how can I save data this way with a mapper?
>>>
>>> Martin
>>>
>>>
>>> -------------------------------------------------------------------- 
>>> --
>>> ---
>>> Take Surveys. Earn Cash. Influence the Future of IT
>>> Join SourceForge.net's Techsay panel and you'll get the chance to
>>> share your
>>> opinions on IT & business topics through brief surveys -- and earn
>>> cash
>>> http://www.techsay.com/default.php?
>>> page=join.php&p=sourceforge&CID=DEVDEV
>>> _______________________________________________
>>> Sqlalchemy-users mailing list
>>> Sqlalchemy-users@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users
>>
>
>
> ---------------------------------------------------------------------- 
> ---
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to  
> share your
> opinions on IT & business topics through brief surveys -- and earn  
> cash
> http://www.techsay.com/default.php? 
> page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> Sqlalchemy-users mailing list
> Sqlalchemy-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to