我是烧瓶和炼金术的新手,并决定通过使用烧瓶进行大型项目来学习。当我开始在类之间创建关系时。 每个类都在单独的文件和文件夹中。我想要实现的逻辑是每个controlaccount只能分配一个项目,而项目可以分配给多个控制,即一对一的关系。
我一直收到以下错误消息
sqlalchemy.exc.InternalError:(pymysql.err.InternalError)(1054,“字段列表'中的未知列'project_id'”)[SQL:'INSERT INTO controlaccounts(代码,名称,预算,PMB_start
,{ {1}},PMB_finish
,PMU_start
,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中的代码
PMU_finish
项目/模型文件代码是
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
controlaccount代码的表单是
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
,最后是观看代码
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)
答案 0 :(得分: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")