Flask_wtf-UnappedInstanceError:未映射类

Flask_wtf-UnappedInstanceError:未映射类,flask,flask-sqlalchemy,flask-wtforms,Flask,Flask Sqlalchemy,Flask Wtforms,我正在用一个不那么简单的数据库构建一个相对简单的Flask应用程序。我有很多模型来处理和关联数据库中所有需要的信息 由于某种原因,我得到了标题错误 我开始思考与我的数据库模型/关系有多大关系 因此,模型的实现如下所示: from app import db, login from werkzeug.security import generate_password_hash, check_password_hash from flask_login import UserMixin import

我正在用一个不那么简单的数据库构建一个相对简单的Flask应用程序。我有很多模型来处理和关联数据库中所有需要的信息

由于某种原因,我得到了标题错误

我开始思考与我的数据库模型/关系有多大关系

因此,模型的实现如下所示:

from app import db, login
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
import datetime

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password = db.Column(db.String(128))

    def set_password(self, password):
        self.password = generate_password_hash(password)

    def check_password(self, passwd):
        return check_password_hash(self.password, passwd)

    def __repr__(self):
        return '<User {}>'.format(self.username)

class airFeedVariator(db.Model):
    variatorID = db.Column(db.Integer, db.ForeignKey('variator.id',onupdate='RESTRICT',ondelete='RESTRICT'), primary_key=True)
    airFeedID = db.Column(db.Integer, db.ForeignKey('air_feed.id',onupdate='RESTRICT',ondelete='RESTRICT'), primary_key=True)
    variatorRel = db.relationship('Variator', backref='variators',lazy='joined')
    freq = db.Column(db.Integer)


class Variator(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30))
    machineID = db.Column(db.Integer)
    baudrate  = db.Column(db.Integer)
    addedAt = db.Column(db.DateTime, default=datetime.datetime.utcnow) # the current timestamp

class Air_feed(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    timeOn = db.Column(db.Integer)
    timeOff = db.Column(db.Integer)
    desc = db.Column(db.String)
    digital = db.relationship('Pin_function', backref='analog_or_digital', lazy=True)
    airFeedTypeId = db.relationship('Air_feed_type', backref='air_feed_type_id', lazy=True, uselist=False) #This allow the usage for a single element. 1-1 Rel.
    #variators = db.relationship('Variator', secondary=airFeedVariator, lazy='subquery',backref=backref('airfeedvariators', lazy=True))
    variators = db.relationship('airFeedVariator', lazy='dynamic')
我意识到我有一个烧瓶形状和其他的模型形状,我只是在测试

我的问题如下:

 File "c:\app\routes.py", line 49, in SaveVariator
    db.session.add(var)   File "c:\gburner\lib\site-packages\sqlalchemy\orm\scoping.py", line 153, in do
    return getattr(self.registry(), name)(*args, **kwargs)   File "c:\gburner\lib\site-packages\sqlalchemy\orm\session.py", line 1833, in add
    raise exc.UnmappedInstanceError(instance) sqlalchemy.orm.exc.UnmappedInstanceError: Class 'app.forms.VariatorForm' is not mapped
*添加了Problatic route.py部分*

@app.route('/savevariator', methods=['POST'])
def SaveVariator():
    var = VariatorForm(request.form)
    if var.validate_on_submit():
        print('Variator form submit accepted!')

### I was doing this ### Trying to add the FORM to the session!
        db.session.add(var)
        db.session.commit()
#############################
###  INSTEAD I Should be doing this: ######
        variator = Variator(name=var.name, machineID=var.machineID, baudrate=var.baudrate)
        db.session.add(variator)
        db.session.commit()
##############################
        resp = jsonify(success=True)
    else:
        print('Variator form submit NOT accepted!')
        resp = jsonify(success=False)

    return resp

我认为html代码是不必要的,因为在调用保存数据库信息之前,一切都正常

因为我有3个表用于多对多关系,所以我是否遗漏了数据库中的映射关系

任何帮助解决这个问题的人都将不胜感激。 多谢各位

*编辑*
感谢点我这个简单但难以实现的点!(我可能应该更频繁地暂停)。

问题出在路线区段:

@app.route('/savevariator', methods=['POST'])
def SaveVariator():
    var = VariatorForm(request.form)
    if var.validate_on_submit():
        print('Variator form submit accepted!')

### I was doing this ### Trying to add the FORM to the session!
        db.session.add(var)
        db.session.commit()
#############################
###  INSTEAD I Should be doing this: ######
        variator = Variator(name=var.name, machineID=var.machineID, baudrate=var.baudrate)
        db.session.add(variator)
        db.session.commit()
##############################
        resp = jsonify(success=True)
    else:
        print('Variator form submit NOT accepted!')
        resp = jsonify(success=False)

    return resp
多亏了你,我才明白问题出在哪里。再次感谢

我意识到这是一个简单的错误,但我找不到关于错误和解决方案的更多信息。但是,如果管理员认为它不值得保留,可以随意删除它


谢谢。

它看起来像是在将
表单
实例添加到
会话
中,而不是将某个ORM模型的实例添加到会话中。请发布你的
routes.py
文件(直到50),这样我们就可以看到那里发生了什么,因为那里发生了错误。非常感谢@Joost!我试图添加表单,而不是实际的模型。请建立您的回复,以便我可以接受=)没关系,谢谢,很高兴我能帮助:)
@app.route('/savevariator', methods=['POST'])
def SaveVariator():
    var = VariatorForm(request.form)
    if var.validate_on_submit():
        print('Variator form submit accepted!')

### I was doing this ### Trying to add the FORM to the session!
        db.session.add(var)
        db.session.commit()
#############################
###  INSTEAD I Should be doing this: ######
        variator = Variator(name=var.name, machineID=var.machineID, baudrate=var.baudrate)
        db.session.add(variator)
        db.session.commit()
##############################
        resp = jsonify(success=True)
    else:
        print('Variator form submit NOT accepted!')
        resp = jsonify(success=False)

    return resp