Thanks for the swift reply.  Eventually I solved it, by the hint in
your answer about the relationshop referring to no column.  Replacing

    parent_id = Column(Integer, ForeignKey('content.id'))

in the base class to

    parent_id = Column(Integer, ForeignKey(id))

made the trick.  It is however strange that the latter worked fine for
almost a year until I added a  the 2nd FK in the derived classes

On 8 feb, 16:44, Michael Bayer <mike...@zzzcomputing.com> wrote:
> On Feb 8, 2012, at 9:39 AM, cropr wrote:
>
>
>
>
>
>
>
>
>
> > I aam having an issue defining a 2nd foreign key constraint on 2
> > derived classes of a base class that uses a self referential join.
>
> > Base class:ContentBase
>
> > class ContentBase(Base):
> >    __tablename__ = 'content'
> >    __mapper_args__ = {'polymorphic_on': ctype,
> > 'polymorphic_identity':'contentbase'}
> >    id = Column(types.Integer, primary_key=True, autoincrement=True)
> >    children = relationship("ContentBase", backref=backref('parent',
> > remote_side=id))
> >    ....
>
> > Derived class CdRoot
>
> > class CdRoot(ContentBase):
> >    __tablename__ = 'cdroot'
> >    __mapper_args__ = {'polymorphic_identity' : 'cdroot'}
> >    contentType = 'CdRoot'
> >    id = Column(types.Integer, ForeignKey(ContentBase.id),
> > primary_key=True)
> >    clubs = relationship('CdClub', primaryjoin="cdroot.id ==
> > cdclub.cdroot_id")
> >    ...
>
> > Derived class CdClub
>
> > class CdClub(ContentBase):
> >    __tablename__ = 'cdclub'
> >    __mapper_args__ = {'polymorphic_identity' : 'cdclub'}
> >    id = Column(types.Integer, ForeignKey(ContentBase.id),
> > primary_key=True)
> >    cdroot_id = Column(types.Integer, ForeignKey(CdRoot.id))
> >    ...
>
> > The 2nd join between CdRoot and CdClub fails with the message : Can't
> > determine join between content and
> > cdclub, tables have more than one FK constraint.
>
> > Apparently the primaryjoin condition is not sufficient to get rid of
> > the error.  Any clue how to solve this
>
> Assuming this is paraphrasing since "cdroot.id==cdclub.cdroot_id" doesn't 
> have the correct casing, also there's a relationship on ContentBase that 
> doesn't appear to refer to any column but I assume that's under your "...".
>
> Filling in the blanks with reasonable guesses it works fine:
>
> from sqlalchemy import *
> from sqlalchemy.orm import *
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy.ext.associationproxy import association_proxy
>
> Base= declarative_base()
>
> class ContentBase(Base):
>    __tablename__ = 'content'
>    id = Column(Integer, primary_key=True, autoincrement=True)
>    ctype = Column(String)
>    parent_id = Column(Integer, ForeignKey('content.id'))
>    children = relationship("ContentBase", 
> backref=backref('parent',remote_side=id))
>    __mapper_args__ = {'polymorphic_on': 
> ctype,'polymorphic_identity':'contentbase'}
>
> class CdRoot(ContentBase):
>    __tablename__ = 'cdroot'
>    __mapper_args__ = {'polymorphic_identity' : 'cdroot'}
>    contentType = 'CdRoot'
>    id = Column(Integer, ForeignKey(ContentBase.id),primary_key=True)
>    clubs = relationship('CdClub', primaryjoin="CdRoot.id ==CdClub.cdroot_id")
>
> class CdClub(ContentBase):
>    __tablename__ = 'cdclub'
>    __mapper_args__ = {'polymorphic_identity' : 'cdclub'}
>    id = Column(Integer, ForeignKey(ContentBase.id),primary_key=True)
>    cdroot_id = Column(Integer, ForeignKey(CdRoot.id))
>
> configure_mappers()
>
> if you still have problems, please provide a fully working example, thanks !
>
>
>
>
>
>
>
>
>
> > Ruben
>
> > --
> > 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 
> > athttp://groups.google.com/group/sqlalchemy?hl=en.

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

Reply via email to