2014-07-21 2 views
18

데이터베이스 스키마 마이그레이션을 만들려고 할 때 이상한 오류가 발생합니다. 뭐가 잘못 됐는지 알아 내 줄 수있어? 감사!매핑 된 테이블의 기본 키 열을 조합 할 수 없습니다.

나는이납니다 :

$ python app.py db upgrade 
[skipped] 
sqlalchemy.exc.ArgumentError: Mapper Mapper|EssayStateAssociations|essay_associations could not assemble any primary key columns for mapped table 'essay_associations' 

내 모델 :

class EssayStateAssociations(db.Model): 
    __tablename__ = 'essay_associations' 

    ALLOWED_APP_ESSAY_STATES = ["selected", "not_selected", "pending"] 

    application_essay_id = db.Column(
     db.Integer, 
     db.ForeignKey("application_essay.id"), 
     primary_key=True), 
    theme_essay_id = db.Column(
     db.Integer, 
     db.ForeignKey("theme_essay.id"), 
     primary_key=True), 
    state = db.Column(db.String, default="pending") 

    @validates('state') 
    def validate_app_essay_states(self, key, state): 
     assert state in self.ALLOWED_APP_ESSAY_STATES 
     return state 

버전 :

Flask==0.10.1 
Flask-Migrate==1.2.0 
Flask-SQLAlchemy==1.0 
SQLAlchemy==0.9.4 
+0

내가 적절한 해답을 제공 할 것입니다,하지만 지금은 내가 ' 그냥 당신이 진짜 오류가'application_essay_id'의 정의 뒤에 후행 쉼표라고 생각해. 당신이 * tuple * 열 대신 하나의 열을 포함하는 속성을 만들었습니다. 이것은 일반적인 오류가 열을 복사 할 때 기대하고있다. 'op.create_table (에서'모델로 정의 (예 : 수작업으로 만든 마이그레이션에서 선언적 기반에서 자동 생성으로 바꾸는 것) - 적어도이 방법은 * I * 같은 방식으로 이것을 망쳐 놓은 것입니다. –

답변

19

하는 당신은 근래 수 없습니다 테이블에있는 두 개의 기본 키. 대신 복합 기본 키를 사용해야합니다. 이 아래로 모델의 PrimaryKeyConstraint를 추가하여 수행 할 수 있습니다 (__table_args__에 브래킷을 닫기 전에 쉼표를 추가해야합니다 : 나는 시간이있을 때

from db import PrimaryKeyConstraint 

class EssayStateAssociations(db.Model): 
    __tablename__ = 'essay_associations' 
    __table_args__ = (
     PrimaryKeyConstraint('application_essay_id', 'theme_essay_id'), 
    ) 

    ALLOWED_APP_ESSAY_STATES = ["selected", "not_selected", "pending"] 

    application_essay_id = db.Column(
     db.Integer, 
     db.ForeignKey("application_essay.id")) 
    theme_essay_id = db.Column(
     db.Integer, 
     db.ForeignKey("theme_essay.id")) 
    state = db.Column(db.String, default="pending") 

    @validates('state') 
    def validate_app_essay_states(self, key, state): 
     assert state in self.ALLOWED_APP_ESSAY_STATES 
     return state 
+6

테이블의 두 기본 키! ref : http : //docs.sqlalchemy.o rg/en/rel_1_0/orm/extensions/associationproxy.html # simplifying-association-objects – karantan

+0

@karantan, 아니요. 테이블에 기본 키가 두 개있을 수 없습니다. 정의로는 불가능합니다. 그 doco 페이지가 보여주는 것은 하나의 기본 키에 여러 개의 * 컬럼을 가질 수 있다는 것입니다. 일부 DBMS에서는 프라이 머리 키의 많은 속성을 가지고 있지만 "기본"이 아닌 정의에 의한 추가 'UNIQUE KEY'제약 조건을 선언 할 수도 있습니다. –

관련 문제