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

Reply via email to