2014-07-21 11 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' की परिभाषा के बाद पिछली कॉमा थी। आपने संपत्ति को एक कॉलम के बजाय एक कॉलम युक्त * टुपल * में बनाया है। मुझे उम्मीद है कि कॉलम कॉपी करते समय यह एक आम त्रुटि है 'op.create_table (' एक मॉडल में (जैसे हाथ-क्राफ्टिंग माइग्रेशन से घोषणात्मक आधार से उन्हें स्वत: उत्पन्न करने के लिए स्वैप करने के लिए स्वैप करें) - कम से कम, यह है कि * मैंने * इसे उसी तरह गड़बड़ कर दिया है। –

उत्तर

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

आपके पास हो सकता है एक टेबल में दो प्राथमिक कुंजी! रेफरी: http: //docs.sqlalchemy.o आरजी/एन/rel_1_0/orm/एक्सटेंशन/associationproxy.html # सरलीकरण-एसोसिएशन-ऑब्जेक्ट्स – karantan

+0

@ कंटनान, नहीं, आपके पास तालिका में दो प्राथमिक कुंजी नहीं हो सकती हैं - यह परिभाषा के अनुसार असंभव है। वह डॉको पेज दिखाता है, आप एकल प्राथमिक कुंजी में एकाधिक * कॉलम * प्राप्त कर सकते हैं। कुछ डीबीएमएस में, आप अतिरिक्त 'अनन्य कुंजी' बाधाओं को भी घोषित कर सकते हैं जिनमें प्राथमिक कुंजी के कई गुण होते हैं लेकिन परिभाषा के अनुसार, "प्राथमिक" नहीं हैं। –

संबंधित मुद्दे