Yep, there it is. Stupidly simple. Dug up some old know working source that did and diff and grep later I found the cause.
__table_args__ needs to be give a tuple with an empty dictionary, like so. __table_args__ = (ForeignKeyConstraint(['parent_id', 'parent_ref'], ['parent.id', 'parent.ref']), {}) Now all is well, sorry for the ML clutter. I am face palming in 3, 2, 1 .... On Apr 8, 4:49 pm, Wayne Witzel <wwitz...@gmail.com> wrote: > I assume I am over looking some simple thing, but I just can't seem to > find it. Thanks for the assist, I have palms open ready for face > planting. > > Using a class and table with orm.mapper() > > class Child(object): > pass > child_table = Table('child', meta.metadata, > Column('parent_id', Integer, primary_key=True), > Column('parent_ref', Integer, nullable=False), > Column('content', String(10)), > ForeignKeyConstraint(['parent_id', 'parent_ref'], > ['parent.id', 'parent.ref']) > ) > orm.mapper(Child, child_table) > > class Parent(object): > pass > parent_table = Table('parent', meta.metadata, > Column('id', Integer, primary_key=True), > Column('ref', Integer, primary_key=True) > ) > orm.mapper(Parent, parent_table, properties={ > 'children':relation(Child, lazy=False) > > }) > > Produces the following create > > 2009-04-08 16:36:54,319 INFO sqlalchemy.engine.base.Engine.0x...a6b0 > CREATE TABLE parent ( > id INTEGER NOT NULL, > ref INTEGER NOT NULL, > PRIMARY KEY (id, ref) > ) > 2009-04-08 16:36:54,319 INFO sqlalchemy.engine.base.Engine.0x...a6b0 > {} > 2009-04-08 16:36:54,454 INFO sqlalchemy.engine.base.Engine.0x...a6b0 > COMMIT > 2009-04-08 16:36:54,456 INFO sqlalchemy.engine.base.Engine.0x...a6b0 > CREATE TABLE child ( > parent_id INTEGER NOT NULL, > parent_ref INTEGER NOT NULL, > content VARCHAR(10), > PRIMARY KEY (parent_id), > FOREIGN KEY(parent_id, parent_ref) REFERENCES parent (id, ref) > ) > > Using what I believe is the exact same thing with declarative produces > the creates minus the composite foreign key and then of course is > unable to establish the relation. > > class Parent(Base): > __tablename__ = 'parent' > id = Column(Integer, primary_key=True) > ref = Column(Integer, primary_key=True) > children = relation("Child", lazy=False) > > class Child(Base): > __tablename__ = 'child' > __table_args__ = ForeignKeyConstraint(['parent_id','parent_ref'], > ['parent.id', 'parent.ref']) > > parent_id = Column(Integer, primary_key=True) > parent_ref = Column(Integer, nullable=False) > content = Column(String(10)) > > The create output is > > 2009-04-08 16:47:08,331 INFO sqlalchemy.engine.base.Engine.0x...a710 > CREATE TABLE child ( > parent_id INTEGER NOT NULL, > parent_ref INTEGER NOT NULL, > content VARCHAR(10), > PRIMARY KEY (parent_id) > ) > 2009-04-08 16:47:08,331 INFO sqlalchemy.engine.base.Engine.0x...a710 > {} > 2009-04-08 16:47:08,464 INFO sqlalchemy.engine.base.Engine.0x...a710 > COMMIT > 2009-04-08 16:47:08,466 INFO sqlalchemy.engine.base.Engine.0x...a710 > CREATE TABLE parent ( > id INTEGER NOT NULL, > ref INTEGER NOT NULL, > PRIMARY KEY (id, ref) > ) --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---