2015-07-21 2 views
0

Я использовал history_meta расширение (http://docs.sqlalchemy.org/en/latest/_modules/examples/versioned_history/history_meta.html) для SQLAlchemy.Полиморфная идентификация + history_mapper

Проблема заключается в том, что, кажется, не хорошо работать с полиморфной идентичностью, по крайней мере, при использовании нескольких таблиц, как так:

class BaseVersion(Versioned, Base): 
    __tablename__ = 'base_version' 
    id = Column(Integer, primary_key=True) 
    ... 
    __mapper_args__ = { 
     'polymorphic_identity':'base_version', 
     'polymorphic_on':type, 
    } 

(обратите внимание, что BaseVersion использует Versioned подмешать, определенные в history_meta)

Тогда есть класс, который наследует от BaseVersion:

class UnspecifiedVersion(BaseVersion): 
    __tablename__ = 'unspecified_version' 
    id = Column(Integer, ForeignKey('base_version.id'), primary_key=True) 
    related_base_version_id = Column(Integer, ForeignKey('base_version.id'), index=True) 
    related_base_version = relationship('BaseVersion', uselist=False, foreign_keys=[related_base_version_id]) 
    __mapper_args__ = { 
     'polymorphic_identity':'unspecified_version', 
     'inherit_condition':(related_base_version_id==BaseVersion.id) 
    } 

Backend БД Pos tgres.

Попытка произвести таблицу истории для нее заканчивается ошибкой:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) there is no unique constraint matching given keys for referenced table "base_version_history"  
[SQL: ' 
CREATE TABLE unspecified_version_history (
     id INTEGER NOT NULL, 
     related_base_version_id INTEGER, 
     version INTEGER NOT NULL, 
     changed TIMESTAMP WITHOUT TIME ZONE, 
     changed_by VARCHAR, 
     PRIMARY KEY (id, version), 
     FOREIGN KEY(id, related_base_version_id, version) REFERENCES base_version_history (id, id, version) 
) 

'] 

Теперь это странно, потому что base_version_history таблицы определенно имеет id и version столбцов.

ответ

0

Я только что преодолел эту ошибку с чем-то похожим. Ваш вопрос, как представляется, с составными первичными ключами и составных внешних ключей, которые генерируются, как видно из этих двух последних строках SQL:

PRIMARY KEY (id, version), 
FOREIGN KEY(id, related_base_version_id, version) REFERENCES base_version_history (id, id, version) 

Составные внешние ключи должны найти соответствующие сложные уникальные ключи (в основном). Если в этой таблице был создан первичный ключ с двумя столбцами, то вероятность того, что другая сделана тоже, и внешний ключ ищет трехколоночный уникальный ключ. Кроме того, один и тот же столбец дважды выглядит неправильно: (id, id, version). Я не знаю расширение, с которым вы работаете, поэтому я не могу сказать вам, как его исправить.

Смежные вопросы