2017-02-21 7 views
0

Я новичок в колбе и алхимии и решил научиться, работая над большим проектом с использованием колбы. Когда я начал создавать отношения между классами. Каждый из классов находится в отдельном файле и папке. логика, которую я хочу реализовать, каждый элемент управления может иметь только один проект, назначенный ему, тогда как проект может быть назначен нескольким контрольным учетным записям, т. е. отношениям один-к-манту.Ошибка отношения кол-алхимии

я получаю следующее сообщение об ошибке sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1054, "Неизвестный столбец 'PROJECT_ID' в 'списке полей'") [SQL: «INSERT INTO controlaccounts (код , имя, бюджет, PMB_start, PMB_finish, PMU_start, PMU_finish, parent_id, project_id) ЗНАЧЕНИЯ (% s,% s,% s,% s,% s,% s,% s,% s,% s) '] [параметры : ('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 

код файла проекта/модели является

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

Это происходит из-за ошибки отступа вы сделали определения вам 'project_id' недвижимости в' ControlAccount' – MrLeeh

+0

Углубления правильно в моем коде; это просто форматирование в потоке интересов. Я скорректировал его в прилагаемом коде. –

+0

Это было связано с проблемой. Если ошибка с отступом не только в сообщении, но и в файле проекта, это приведет к тому, что вы указали именно ту ошибку, о которой вы писали. Это связано с тем, что тогда вы определяете 'project_id' вне класса' ControlAccount', поскольку отступ имеет решающее значение для структурирования кода в Python. – MrLeeh

ответ

0

Как ошибка говорит project_id поле отсутствует в вашей базе данных. Посмотрите на средство просмотра базы данных, если оно было создано. В противном случае удалите базу данных и заново создайте ее с помощью db.create_all().

Также должно быть удалено поле project в классе Project. Это не имеет смысла. Если вы хотите получить backref для связанных контрольных учетных записей, просто добавьте backref в свой класс ControlAccount. См. 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

Мне пришлось отбросить и заново создать таблицы для работы. благодаря –

Смежные вопросы