一尘不染

flask中的sqlalchemy.orm.exc.UnmappedInstanceError

flask

我一直在阅读SQLAlchemy文档,但我听不懂。错误(UnmappedInstanceError)表示未映射某些内容。没有映射什么?我真的没有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'))

阅读 1534

收藏
2020-04-08

共2个答案

一尘不染

q = request.form['name']
# do for 12 more fields
db.session.add(q)

request.form['name']将返回一个unicode值。那你就…

db.session.add(q)

会话的目标是跟踪实体(Python对象),而不是你似乎想这样做的单个unicode值。因此,你应该添加具有映射关系的User对象(例如ORM教程的“映射”部分中显示的对象),但实际上是在传递简单的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,则可能不关心连接池)。

如果你想了解Flask-SQLAlchemy,我首先建议你通过使用简单的脚本(如教程中所示)尝试一下SQLAlchemy的工作原理(尤其是ORM方面),然后你将了解Flask-SQLAlchemy的工作原理。 。

2020-04-08
一尘不染

当你将非模型对象添加到会话中时,你将获得UnmappedInstanceError

在你的情况下,q可能是unicode字符串,而不是模型对象。(看来你使用的是Python 2.x,因为在Python 3.x中,它将显示为str),这是导致以下问题的根本原因UnmappedInstanceError: Class '__builtin__.unicode' is not mapped:

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