Наследование объединенной таблицы SQLAlchemy с дискриминатором, являющимся частью первичного ключа

#python #sqlalchemy

#python #sqlalchemy

Вопрос:

Давайте начнем с примера из документов для наследования объединенной таблицы

 class Employee(Base):
    __tablename__ = 'employee'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    type = Column(String(20))

    __mapper_args__ = {
        'polymorphic_on':type,
        'polymorphic_identity':'employee'
    }

class Engineer(Employee):
    __tablename__ = 'engineer'
    id = Column(Integer, ForeignKey('employee.id'), primary_key=True)
    engineer_name = Column(String(30))

    __mapper_args__ = {
        'polymorphic_identity':'engineer',
    }

class Manager(Employee):
    __tablename__ = 'manager'
    id = Column(Integer, ForeignKey('employee.id'), primary_key=True)
    manager_name = Column(String(30))

    __mapper_args__ = {
        'polymorphic_identity':'manager',
    }
  

Теперь мне нужно что-то вроде:

 class Employee(Base):
    __tablename__ = 'employee'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    type = Column(String(20), primary_key=True) // <----------- Change

    __mapper_args__ = {
        'polymorphic_on':type,
        'polymorphic_identity':'employee'
    }

class Engineer(Employee):
    __tablename__ = 'engineer'
    id = Column(Integer, primary_key=True) // <----------- Change
    type = Column(String(20), primary_key=True) // <----------- Added
    engineer_name = Column(String(30))

    __table_args__ = (ForeignKeyConstraint([id , type ],             // <----------- Added
                                      [Employee.id, Employee.type],
                                      ondelete='CASCADE', ),)

    __mapper_args__ = {
        'polymorphic_identity':'engineer',
    }

class Manager(Employee):
    __tablename__ = 'manager'
    id = Column(Integer, primary_key=True) // <----------- Change
    type = Column(String(20), primary_key=True) // <----------- Added
    manager_name = Column(String(30))


    __table_args__ = (ForeignKeyConstraint([id , type ],             // <----------- Added
                                      [Employee.id, Employee.type],
                                      ondelete='CASCADE', ),)

    __mapper_args__ = {
        'polymorphic_identity':'manager',
    }
  

Мой вопрос

Хотя приведенный выше код работает, я не настолько разбираюсь в SQLAlchemy, и мне интересно узнать, есть ли проблемы с этим кодом, о которых я еще не знаю и с которыми могу столкнуться, и, что более важно, есть ли правильный / лучший способ реализовать это наследование объединенной таблицы с несколькими первичными ключами, как показано выше.

Примечание: Основная проблема заключается в том, что в примере docs дискриминатор type размещается только в базовом классе, но мне нужен был тип, который также был бы первичным ключом.