2014-09-05 4 views
0

나는 목적의 구조가 동일하지만 별개 SQLAlchemy의 모델을 사용하여 두 테이블, 또한 Magazine (미도시 참조하는 WhitelistBlacklist을 만들려고 해요 주어진 키와 일치하는 고유 제한 조건이 없습니다). 그들은 둘 다 캠페인 (예를 들어 정치 캠페인)의 인스턴스에 fkey하고 Politician 모델 (또한 표시되지 않음)에 fkey가 있습니다. 에 대한 블랙리스트/화이트 다수가있을 수 있기 때문에 1 Campaign에,하지만 난 sqlalchemy.exc.ProgrammingError: (ProgrammingError) there is no unique constraint matching given keys for referenced table "campaigns"를 얻을 마이그레이션을 실행할 때 :SQLAlchemy의 스키마는 : 참조 된 테이블

나는 Whitelist/Blacklist 될 많은 떠올하고 있습니다. 또한 Campaign에서 Politician까지 M : 1이 필요합니다.

화이트리스트와 블랙리스트가 별개의 테이블에있는 이유는 이것이 고유 한 제약 조건 오류의 원인을 설명 할 수 있습니까? 또한이 관계형 스키마를 어떻게 만들 수 있습니까? 자체가 M입니다 Campaign 동안 CampaignWhitelist/Blacklist에서 1 :

class Campaign(Base): 
    __tablename__ = "campaigns" 
    id = Column(Integer, primary_key=True, nullable=False) 
    politician_id = Column(Integer, ForeignKey('politician.id'), nullable=False) 
    description = Column(Text, nullable=True) 


class Whitelist(Base): 
    __tablename__ = "whitelist" 
    id = Column(Integer, primary_key=True, nullable=False) 
    campaign_id = Column(Integer, ForeignKey('campaign.id'), nullable=False) 
    magazine_id = Column(Integer, ForeignKey('magazine.id'), nullable=False) 


class Blacklist(Base): 
    __tablename__ = "blacklist" 
    id = Column(Integer, primary_key=True, nullable=False) 
    campaign_id = Column(Integer, ForeignKey('campaign.id'), nullable=False) 
    magazine_id = Column(Integer, ForeignKey('magazine.id'), nullable=False) 

답변

0

관계 때문에 M의 참 불법 것으로 보인다 1 Politician합니다. 내가 대신 그 접근 방식을 폐기하고, 모델은 지금과 같이 : 원래의 접근 방식은 Flask-Admin에 조금 더 좋은 적합하도록 구성되었다

class Campaign(Base): 
    __tablename__ = "campaigns" 
    id = Column(Integer, primary_key=True, nullable=False) 
    politician_id = Column(Integer, ForeignKey('politician.id'), nullable=False) 
    description = Column(Text, nullable=True) 


class Listing(Base): 
    __tablename__ = "listings" 
    id = Column(Integer, primary_key=True, nullable=False) 
    campaign_id = Column(Integer, ForeignKey('campaign.id'), nullable=False) 
    magazine_id = Column(Integer, ForeignKey('magazine.id'), nullable=False) 
    listing_type = Column(String, nullable=False) 

하지만이 추가 쿼리를 줄이고 이전에 필요한 참여하기 때문에이 방법은 더 확대됨입니다 강생. Flask-Admin과 함께 사용하려는 이러한 유형의 접근 방법을 생각하는 사용자는 inline_model()을 사용하여 UI를 좀 더 명확하고 쉽게 관리 할 수 ​​있습니다.

+1

테이블 A -> 테이블 B (M : 1), 테이블 B -> 테이블 C (M : 1)이 잘못된 이유는 알 수 없습니다. –