Well, you could specify the primaryjoin as described here: http://www.sqlalchemy.org/docs/adv_datamapping.myt#advdatamapping_properties_customjoin
but I suspect that your existing mapper will Just Work if you switch to a composite FK, rather than 3 keys on individual columns t_bovines = Table( 'bovines', metadata, Column('id', Integer, primary_key=True), Column('entrydate', Integer), Column('key1', Integer), Column('key2', Integer), Column('key3', String), Column('var', Integer), Column('val', Integer), ForeignKeyConstraint(['key1', 'key2', 'key3'], ['enterprise.key1', 'enterprise.key2', 'enterprise.key3']) ) t_entreprises = Table( 'entreprises', metadata, Column('key1', Integer), Column('key2', Integer), Column('key3', String), Column('lname', Unicode(30)), Column('fname', Unicode(30)), Column('street', Unicode(30)), Column('country', String(1)), Column('zip', String(5)), Column('locality', Unicode(30)), PrimaryKeyConstraint('key1', 'key2', 'key3') ) # similarly adjust surfaces On 1/9/07, exhuma.twn <[EMAIL PROTECTED]> wrote: > > Hi, > > I have to load a table from 2 different data-sources witch each having > 3 different primary keys. This is because those 2 datasources are > already exported from 3 databases from an archaic application. > > >From those 2 datasources I created - after normalising - 3 new tables. > The main table keeps the 3 primary keys as one composite primary key. > The two other tables have those 3 fields as foreign keys. Now, if I map > those table definitions onto a table with relations, sqlalchemy > complains with the following error: > > """ > sqlalchemy.exceptions.ArgumentError: Error determining primary and/or > secondary join for relationship 'bovines' between mappers > 'Mapper|Enterprise|entreprises' and 'Mapper|Bovine|bovines'. 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 'entreprises' > and 'bovines'; tables have more than one foreign key constraint > relationship between them. Please specify the 'onclause' of this join > explicitly." > """ > > Ok, so I have to specify the "onclause". But how do I do that? For > reference, here is the (non-working) data definition: > > t_bovines = Table( 'bovines', metadata, > Column('id', Integer, primary_key=True), > Column('entrydate', Integer), > Column('key1', Integer, ForeignKey('entreprises.key1')), > Column('key2', Integer, ForeignKey('entreprises.key2')), > Column('key3', String, ForeignKey('entreprises.key3')), > Column('var', Integer), > Column('val', Integer), > ) > > t_entreprises = Table( 'entreprises', metadata, > Column('key1', Integer, primary_key=True), > Column('key2', Integer, primary_key=True, default=0), > Column('key3', String, primary_key=True), > Column('lname', Unicode(30)), > Column('fname', Unicode(30)), > Column('street', Unicode(30)), > Column('country', String(1)), > Column('zip', String(5)), > Column('locality', Unicode(30)), > ) > > t_surfaces = Table( 'surfaces', metadata, > Column('id', Integer, primary_key=True), > Column('entrydate', Integer), > Column('key1', Integer, ForeignKey('entreprises.key1')), > Column('key2', Integer, ForeignKey('entreprises.key2')), > Column('key3', String, ForeignKey('entreprises.key3')), > Column('var', Integer), > Column('val', Integer), > ) > > metadata.create_all() > > class Bovine(object): > pass > > class Surface(object): > pass > > class Enterprise(object): > def __repr__(self): > return "[Entreprise %s %s %s]" % (self.key1, self.key2, > self.key3) > > usermapper = mapper(Bovine, t_bovines) > usermapper = mapper(Surface, t_surfaces) > usermapper = mapper(Enterprise, t_entreprises, properties={ > 'bovines': relation(Bovine), > 'surfaces': relation(Surface) > }) > > > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---