Python sqlalchemy.orm.exc.UnappedInstanceError在烧瓶中

Python sqlalchemy.orm.exc.UnappedInstanceError在烧瓶中,python,sqlalchemy,flask,flask-sqlalchemy,Python,Sqlalchemy,Flask,Flask Sqlalchemy,我一直在读SQLAlchemy文档,但我不理解它们。错误(UnappedInstanceError)表示未映射某些内容。什么没有映射?我真的不懂sqlalchemy,我想继续使用裸sqlite,但是很多人推荐这个,所以我认为我应该学习它。以下是回溯: File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1836, in __call__ return self.wsgi_app(environ, sta

我一直在读SQLAlchemy文档,但我不理解它们。错误(UnappedInstanceError)表示未映射某些内容。什么没有映射?我真的不懂sqlalchemy,我想继续使用裸sqlite,但是很多人推荐这个,所以我认为我应该学习它。以下是回溯:

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)

File "C:\Users\Me\repos\mandj2\app\views.py", line 170, in add_manentry
db.session.add(q)

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\sqlalchemy\orm\scoping.py", line 149, in do
return getattr(self.registry(), name)(*args, **kwargs)

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\sqlalchemy\orm\session.py", line 1452, in add
raise exc.UnmappedInstanceError(instance)

UnmappedInstanceError: Class '__builtin__.unicode' is not mapped
以下是适用的代码:

@app.route('/addm', methods=['POST'])
def add_mentry():
    if not session.get('logged_in'):
        abort(401)
    form = MForm(request.form)
    filename = ""
    if request.method == 'POST':
        cover = request.files['cover']
        if cover and allowed_file(cover.filename):
            filename = secure_filename(cover.filename)
            cover = cover.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

    q = request.form['name']
    # do for 12 more fields
    db.session.add(q)
    db.session.commit()
    flash('New entry was successfully posted')
    return redirect(url_for('moutput'))
请求。表单['name']
将返回一个unicode值。那么,你真的

db.session.add(q)
会话的目标是跟踪实体(Python对象),而不是像您试图做的那样跟踪单个unicode值(有关会话的更多信息,请参阅)。因此,您应该添加具有映射的对象(例如,
User
对象,如的中所示),但实际上传递的是一个简单的unicode值

您所使用的只是SQLAlchemy的一部分:ORM(对象关系映射器)。ORM将尝试执行以下操作:允许您创建一个新的python对象,并通过将对象“添加”到会话中自动生成SQL

a = MyEntity()
session.add(a)
session.commit() # Generates SQL to do an insert for the table that MyEntity is for
请记住,您可以在不使用ORM功能的情况下使用SQLAlchemy。您可以执行
db.execute('INSERT…',val1,val2)
来替换已经“裸”的SQL。SQLAlchemy将为您提供连接池等功能(尽管如果您使用的是SQLite,您可能不关心连接池)


如果您想了解SQLAlchemy,我首先建议您通过使用简单的脚本来尝试了解SQLAlchemy是如何工作的(尤其是ORM端)(如中所示。然后您将了解Flask SQLAlchemy将如何使用它。

当您将非模型对象添加到会话中时,您将得到
UnappedInstanceError

在您的例子中,
q
可能是一个unicode字符串,而不是一个模型对象(看起来您使用的是Python 2.x,因为在Python 3.x中,它会说str),这是导致
不匹配的根本原因错误:类“\uu builtin\uuuu.unicode”未映射

  File "C:\Users\Me\repos\mandj2\app\views.py", line 170, in add_manentry
  db.session.add(q)

如果要更改数据库,请参阅: 您必须指定要更改的对象中的项目。请参见以下内容:

client = session.query(Clients).filter_by(id=client_id).one()
if request.method == 'POST':
    new_name = request.form['form_name']
    client.name = new_name
    session.add(client)
    session.commit()
正如您在“客户端”对象中所看到的,在对象内部的其他信息中,我们有“名称”。我们只想直接更改“名称”,因此您需要向其发送地址。(client.name)


如果要向数据库添加新内容: 在这里,当您使用orm向数据库添加新值时,您需要指定接收数据的对象中的项。 在本例中(Client.name)


希望这能有所帮助。

我明白了。我对python一般来说都是新手(我制作这个程序是为了学习,因为我通过实践学习得更好),但是仍然有很多术语我没有得到。比如object。这就是我尝试做的:
name=form.name.data\n q=MForm(name,obj=name)
。它给了我一个错误
类型错误:formdata应该是一个支持“getlist”方法的multidict类型包装器
,这是我在阅读教程时遇到的错误。我读过的使用flask sqlalchemy的教程使用ORM函数,所以我不想排除它们。我会继续阅读文档,因为我不知道是什么我正在做。看看你是否可以开始变小,然后逐渐增加。现在不要担心SQLAlchemy,专注于Flask和表单库(或者忘记Flask和表单,专注于SQLAlchemy)。这样一来,你就不太可能在其中一个方面出错,这会让你觉得你在另一个方面没有理解。好的。我已经用SQLite完成了它,所以我想我可以变得更时尚,避免将来的一些麻烦。谢谢你的帮助。
client = session.query(Clients).filter_by(id=client_id).one()
if request.method == 'POST':
    new_name = request.form['form_name']
    client.name = new_name
    session.add(client)
    session.commit()
    if request.method == 'POST':
        new_name = request.form['form_name']
        name = Clients(name=new_name)
        session.add(name)
        session.commit()