2014-07-21 26 views
18

için birincil anahtar sütunları bir araya getirilemedi Bir veritabanı şeması geçişi oluşturmaya çalıştığımda, garip bir hata alıyorum. Yanlış olanı bulmak için bana yardımcı olabilir misiniz? Teşekkürler!Eşlenen tablo

Bunu alıyorum:

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

Benim modelim:

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 

sürümleri:

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

doğru dürüst bir cevap vereceğiz ama şimdilik ben Ben sadece senin gerçek hatanın 'application_essay_id' tanımından sonra takip eden virgül olduğunu sanırdım.Maliyeti bir sütun yerine bir sütun içeren bir * tuple * yaptın.Ben sütun kopyalarken bu ortak bir hata olduğunu bekliyorum bir op.create_table (bir modele (örneğin el yordamıyla el yordamı oluşturma işleminden, bunları bir deklaratif tabana dönüştürecek şekilde) dönüştüren tanımlar - en azından, bu şekilde * ben * bunu aynı şekilde becerdim. –

cevap

19

Sen hav olamaz Bir tabloda iki ana anahtar. Bunun yerine, bir bileşik birincil anahtar kullanmanız gerekir. Bu aşağıda Modelinizdeki bir PrimaryKeyConstraint ekleyerek yapılabilir (__table_args__ yılında braket kapatmadan önce virgül eklemeyi unutmayın: Zamanım olduğunda

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

bir tabloda iki ana anahtar! ref: http: //docs.sqlalchemy.o rg/tr/rel_1_0/orm/extensions/associationproxy.html # sadeleştirme-ilişkilendirme-nesneleri – karantan

+0

Karantan, hayır bir tabloda iki tane ana anahtar olamaz; bu, tanım gereği imkansız. Bu doco sayfasının gösterdiği şey, tek ana anahtarda birden çok * sütun * olabilir. Bazı DBMS'lerde, bir birincil anahtarın birçok özelliğine sahip olan ancak "birincil" değil, tanım gereği olan ek "ÖZEL ANAHTAR" kısıtlamaları da bildirebilirsiniz. –

İlgili konular