Можно ли смешивать стратегию наследования в иерархии - то есть объединенную таблицу для первой пары таблиц в иерархии, а затем использовать одну таблицу для ветви?
Например:
class AbstractBase(Base):
__tablename__ = 'base'
id: int = Column(Integer, primary_key=True)
type: str = Column(String(50))
created: datetime = Column(DateTime, default=datetime.utcnow())
__mapper_args__ = {
'polymorphic_identity': 'base',
'polymorphic_on': type
}
class JoinA(AbstractBase):
__tablename__ = "a"
id = Column(Integer, ForeignKey('base.id'), primary_key=True)
__mapper_args__ = {
'polymorphic_identity': 'a',
}
class JoinB(AbstractBase):
__tablename__ = "b"
id = Column(Integer, ForeignKey('base.id'), primary_key=True)
__mapper_args__ = {
'polymorphic_identity': 'a',
}
class SingleTableA(TypeA):
__mapper_args__ = {
'polymorphic_identity': 'single_table_a',
}
class SingleTableB(TypeA):
__mapper_args__ = {
'polymorphic_identity': 'single_table_a',
}
Я попробовал, но получаю сообщение об ошибке NotNullViolation, из-за которого не создается запись в базовой таблице
E sqlalchemy.exc.IntegrityError: (psycopg2.errors.NotNullViolation) null value in column "id" violates not-null constraint
E DETAIL: Failing row contains (null).
E
E [SQL: INSERT INTO a DEFAULT VALUES]
E (Background on this error at: http://sqlalche.me/e/gkpj)