I was trying to do the same thing, But i wanted a different
discriminator for the second level of inheritance.

I changed mine to use the same polymorphic_on for both levels and it
seemed to work for me (although not exactly how i wanted it to be)

My suggestion is :
Get rid of your engineer_id  or id in MechanicalEngineer, you don't
need both as they will be the same value.
Add "  'with_polymorphic': '*'  " to the __mapper_args__ of both base
classes.

I can email you this in working form if you want.
################# Here is what worked for me ##################

Base = declarative_base()

# ================================  Actions Base
==============================

class _UtConfActions(Base):

        __tablename__ = 'tblActions'

        # 1 to Many relationship to the managed
        id = Column(Integer, primary_key=True)
        managed_id = Column(Integer, ForeignKey('tblManagedDetails.id'))
        action = Column(String)

        __mapper_args__ = {'polymorphic_on': action, 'with_polymorphic': '*'}

# ============================== Reconciler Actions
===========================

class _UtConfReconcilerActions(_UtConfActions):

        __tablename__ = 'tblReconcilerActions'

        # 1 to Many relationship to the managed
        id = Column(Integer, ForeignKey('tblActions.id'), primary_key=True)
        action = Column(String)
        object_type = Column(String)

        __mapper_args__ = {'polymorphic_identity': 'RECONCILER',
'polymorphic_on': action, 'with_polymorphic': '*'}


# ======================= Reconciler Snaphot Actions
==========================

class _UtConfReconcilerActionSnapshot(_UtConfReconcilerActions):

        __tablename__ = 'tblReconcilerActionSnapshot'
        __mapper_args__ = {'polymorphic_identity': 'R_SNAPSHOT'}

        # Joined table inheritence
        id = Column(Integer, ForeignKey('tblReconcilerActions.id'),
primary_key=True)

        revision = Column(String)
        comment = Column(String)

##########################################################

On Oct 1, 8:38 pm, Julian Krause <julian.kra...@gmail.com> wrote:
> I have looked all over to a solution for this issue and haven't found
> a solution. I am trying to use inheritance more than one level deep
> and it does not seem to set the discriminator field on the top level
> item. It works fine if it is only subclassed once but when you try and
> do it twice it fails. The code below shows this happening in as short
> of an example as I could come up with.
>
> Thanks in advance for help,
>
> Julian Krause
>
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy import Column, Integer, String, ForeignKey,
> create_engine
> from sqlalchemy.orm import sessionmaker
>
> Base = declarative_base()
>
> class Person(Base):
>     __tablename__ = 'people'
>     id = Column(Integer, primary_key=True)
>     discriminator = Column('type', String(50))
>     __mapper_args__ = {'polymorphic_on': discriminator}
>
> class Engineer(Person):
>     __tablename__ = 'engineers'
>     id = Column(Integer, ForeignKey('people.id'), primary_key=True)
>     primary_language = Column(String(50))
>     discriminator = Column('type', String(50))
>     __mapper_args__ = {'polymorphic_identity': 'engineer',
> 'polymorphic_on': discriminator}
>
> class MechanicalEngineer(Engineer):
>     __tablename__ = 'mechanical_engineers'
>     __mapper_args__ = {'polymorphic_identity': 'mechanical_engineer'}
>     id = Column(Integer, ForeignKey('people.id'), primary_key=True)
>     engineer_id = Column(Integer, ForeignKey('engineers.id'),
> primary_key=True)
>     primary_tool = Column(String(50))
>
> engine = create_engine('sqlite:///test.db', echo=True)
> Base.metadata.drop_all(engine)
> Base.metadata.create_all(engine)
> Session = sessionmaker(autocommit=False, autoflush=False, bind=engine)
>
> sess = Session()
>
> me = MechanicalEngineer()
> sess.add(me)
> sess.commit()
--~--~---------~--~----~------------~-------~--~----~
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