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