2015-07-21 46 views
0

我對SQLAlchemy使用了history_meta擴展名(http://docs.sqlalchemy.org/en/latest/_modules/examples/versioned_history/history_meta.html)。多態身份+ 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使用在history_meta定義Versioned混入)

然後有繼承的類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) 
    } 

後端DB是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表肯定有idversion列。

回答

0

我剛剛通過類似的事情得到了同樣的錯誤。您的問題似乎與複合主鍵和正在生成的複合外鍵,如出現在SQL的這些最後兩行:

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

複合外鍵需要找到匹配的複合唯一鍵(基本)。如果這個表創建了一個兩列主鍵,那麼另一個主鍵也是可能的,而外鍵正在尋找一個三列唯一鍵。此外,同一列兩次只是看起來不對:(id, id, version)。我不知道你正在使用的擴展名,所以我不能告訴你如何解決它。