#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
размещается только в базовом классе, но мне нужен был тип, который также был бы первичным ключом.