2014-07-21 18 views
18

Quando sto provando a creare una migrazione dello schema del database, ricevo uno strano errore. Potete per favore aiutarmi a capire cosa c'è che non va? Grazie!Impossibile assemblare alcuna colonna chiave primaria per la tabella mappata

sto ottenendo questo:

$ 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' 

mio modello:

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 

Versioni:

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

io vi fornirò una risposta adeguata quando ho tempo, ma per ora' noteremo che il tuo errore reale era la virgola finale dopo la definizione di 'application_essay_id'. Hai trasformato la proprietà in una * tupla * contenente una colonna, invece di una colonna. Mi aspetto che si tratti di un errore comune durante la copia della colonna definizioni da un 'op.create_table (' in un modello (ad esempio per passare da migrazioni manuali a autogenerarle da una base dichiarativa) - almeno, questo è il modo in cui * I * si è fottuto allo stesso modo. –

risposta

19

Non è possibile HAV e due chiavi primarie in una tabella. Invece, è necessario utilizzare una chiave primaria composta. Questo può essere fatto con l'aggiunta di un PrimaryKeyConstraint nel modello come qui di seguito (ricordarsi di aggiungere una virgola prima di chiudere la staffa in __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

Puoi avere due chiavi primarie in una tabella! ref: http: //docs.sqlalchemy.o rg/it/rel_1_0/orm/extensions/associationproxy.html # semplificando-associazione-oggetti – karantan

+0

@karantan, no non puoi avere due chiavi primarie in una tabella - impossibile per definizione. Quello che mostra la pagina doco, puoi avere più * colonne * nella singola chiave primaria. In alcuni DBMS, è anche possibile dichiarare vincoli aggiuntivi 'UNIQUE KEY' che hanno molte proprietà di una chiave primaria ma sono per definizione non" primari ". –

Problemi correlati