2017-02-21 125 views
0

我是燒瓶和鍊金術的新人,並決定通過使用燒瓶在大型項目上進行學習。當我開始創建類之間的關係。 每個類都在單獨的文件和文件夾中。我想要實施的邏輯是每個控制賬戶只能分配一個項目,而項目可以分配到多個控制賬戶,即一對一關係。燒瓶鍊金術關係錯誤

我不斷收到以下錯誤消息 sqlalchemy.exc.InternalError:(pymysql.err.InternalError)(1054, 「未知列在 '字段列表' PROJECT_ID'」)[SQL:「INSERT INTO controlaccounts(代碼,name,budget,PMB_start,PMB_finish,PMU_start,PMU_finish,parent_id,project_id)VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s)'] [parameters :('Root','Root',1.0,datetime.date(2017,12,1),datetime.date(2017,12,31),datetime.date(2018,12,1),datetime.date(2019 ,2,27),1,1)]

我在controlaccounts/models.py

class ControlAccount(db.Model): 
    __tablename__='controlaccounts' 
    id = db.Column(db.Integer, primary_key =True) 
    code = db.Column(db.String(80)) 
    name = db.Column(db.String(80)) 
    budget = db.Column(db.Float) 
    PMB_start = db.Column(db.Date) 
    PMB_finish = db.Column(db.Date) 
    PMU_start = db.Column(db.Date) 
    PMU_finish = db.Column(db.Date) 
    parent_id = db.Column(db.Integer) 
    project_id = db.Column(db.Integer, db.ForeignKey('projects.id')) 


    def __init__(self, code, name, budget, PMB_start, PMB_finish, PMU_start, PMU_finish, parent_id, project): 
     self.code = code 
     self.name = name 
     self.parent_id = parent_id 
     #self.accounttype_id = accounttype.id 
     self.budget = budget 
     self.PMB_start = PMB_start 
     self.PMB_finish = PMB_finish 
     self.PMU_start = PMU_start 
     self.PMU_finish = PMU_finish 
     self.project_id = project.id 


    def __repr__(self): 
     return self.name 
0碼

項目/模型文件中的代碼是

class Project(db.Model): 


__tablename__ ="projects" 
    id = db.Column(db.Integer, primary_key=True) 
    code = db.Column(db.String(80)) 
    name = db.Column(db.String(80)) 
    owner = db.Column(db.Integer, db.ForeignKey('users.id')) 
    description = db.Column(db.Text) 
    start = db.Column(db.DateTime) 
    finish = db.Column(db.DateTime) 
    status = db.Column(db.Boolean) 
    project = db.relationship('ControlAccount', backref='projects', lazy='dynamic',primaryjoin="Project.id == ControlAccount.project_id") 

    def __init__(self, code, name, description, owner, start, finish, status): 
     self.code = code 
     self.name = name 
     self.owner = owner 
     self.description = description 
     self.start = start 
     self.finish = finish 
     self.status = status 

爲controlaccount代碼的形式是

class ControlAccountForm(Form): 

    def get_projects(): 
     return Project.query.all() 

    code = StringField('Code', [validators.Required()]) 
    name = StringField('Type Name', [validators.Required()]) 
    #accounttype = QuerySelectField('Account Type', query_factory= get_account_types) 
    #curve_id = QuerySelectField('Spread Profile', query_factory= get_spread_profile) 
    budget = FloatField('Budget', [validators.Required()]) 
    PMB_start = DateField('Planned Start', [validators.Required()]) 
    PMB_finish = DateField('Planned Finish', [validators.Required()]) 
    PMU_start = DateField('Anticipated Start') 
    PMU_finish = DateField('Anticipated Finish') 
    #parent_id = QuerySelectField('Parent Accounts', query_factory= get_control_accounts) 
    parent_id = IntegerField('Parent ID') 
    project_id = QuerySelectField('Project', query_factory= get_projects) 

和最後一個是意見代碼

@app.route('/newcontrolaccount', methods=['POST', 'GET']) 
def newcontrolaccount(): 
    form = ControlAccountForm() 
    if request.method == "POST" and form.validate(): 
     #accounttype = form.accounttype.data 
     controlaccount = ControlAccount (code= form.code.data, 
          name= form.name.data, 
          #accounttype = form.accounttype.data, 
          budget = form.budget.data, 
          PMB_start = form.PMB_start.data, 
          PMB_finish = form.PMB_finish.data, 
          PMU_start = form.PMU_start.data, 
          PMU_finish = form.PMU_finish.data, 
          parent_id = form.parent_id.data, 
          #curve_id = form.curve_id.data, 
          project = form.project_id.data 
          ) 
     db.session.add(controlaccount) 
     db.session.commit() 
     return redirect(url_for('ca_added')) 
    return render_template('controlaccounts/newaccount.html', form=form, action='new') 
+0

這是因爲你已經確定你'ControlAccount' – MrLeeh

+0

'project_id'屬性的縮進我的代碼正確的縮進錯誤的;它只是一個格式化的東西在利益衝突中。我已經在附上的代碼中更正了它。 –

+0

這實際上與問題有關。如果縮進錯誤不僅出現在帖子中,而且還存在於您的項目文件中,則會導致您寫入的錯誤。這是因爲您在類ControlAccount之外定義了'project_id',因爲縮進對於Python中的代碼結構非常重要。 – MrLeeh

回答

0

由於錯誤說project_id場在數據庫中缺失。使用數據庫查看器查看它是否已創建。否則,請刪除數據庫並使用db.create_all()重新創建它。

另外Project類中的project字段應該被刪除。這沒有意義。如果您想獲取相關控制帳戶的backref,只需在ControlAccount類中添加一個backref。詳細信息請參見http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#one-to-one

class ControlAccount(db.Model): 
    __tablename__='controlaccounts' 
    # ... 
    project_id = db.Column(db.Integer, db.ForeignKey('projects.id')) 
    project = relationship("Project", backref="control_account") 
+0

我不得不放棄並重新創建表以使其工作。謝謝 –