Смешивание типов наследования в SQLAlchemy - PullRequest
0 голосов
/ 20 марта 2020

Можно ли смешивать стратегию наследования в иерархии - то есть объединенную таблицу для первой пары таблиц в иерархии, а затем использовать одну таблицу для ветви?

Например:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...