use*_*242 18 python sqlalchemy flask flask-sqlalchemy
我一直在阅读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
Run Code Online (Sandbox Code Playgroud)
以下是适用的代码:
@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'))
Run Code Online (Sandbox Code Playgroud)
当您将非模型对象添加到会话中时,您将获得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)
Run Code Online (Sandbox Code Playgroud)
q = request.form['name']
# do for 12 more fields
db.session.add(q)
Run Code Online (Sandbox Code Playgroud)
request.form['name']将返回unicode值.然后,你做...
db.session.add(q)
Run Code Online (Sandbox Code Playgroud)
会话的目标是跟踪实体(Python对象),而不是单独的unicode值,因为您似乎正在尝试这样做(有关会话的更多信息,请参阅此处).因此,您应该添加具有映射的User对象(例如ORM教程的"Mapping"部分中显示的对象),但实际上您传递的是一个简单的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
Run Code Online (Sandbox Code Playgroud)
请记住,您可以在不使用ORM功能的情况下使用SQLAlchemy.你可以做的db.execute('INSERT...', val1, val2)就是替换已经"裸"的SQL.SQLAlchemy将为您提供连接池等(尽管如果您使用的是SQLite,您可能不关心连接池).
如果你想了解Flask-SQLAlchemy,我首先建议通过使用简单的脚本(如教程中所示)来了解SQLAlchemy的工作原理(特别是ORM方面).然后你就会明白Flask-SQLAlchemy如何使用它.