The current Flask app is not registered with this ‘SQLAlchemy’ instance. Did you forget to call ‘init_app’, or did you create multiple ‘SQLAlchemy’ instances?
使用Flask开发Web应用时,必不可少的就是使用SQL Alchemy对数据库进行操作。但是经常会看到有些人遇到一个报错,就是以上这些报错提示。
这样的报错通常发生在保存数据及提交时,如以下代码:
db.session.add(spiderbuf)
db.session.commit()
更要命的是,网上很多教程都是这么写的,很多人照抄别人的代码也会报错。这应该令不少人崩溃了!
也有一些国外的论坛给出一些解决方法,但大部分也说得不清不楚,需要不断地尝试才能找到正确的方法。于是我就想着把这个问题的解决该当清晰地表达出来。
其实这个问题跟Flask的机制有关,解决起来也简单,就是加一行代码:with app.app_context():,加在你保存数据的前面,示例代码如下:
with app.app_context():
db.session.add(spiderbuf)
db.session.commit()
这里的app就是你的flask实例,即app=Flask(__name__),spiderbuf就是你的数据表模型的实例。app_context()的意思就是使用flask的进程上下文,因为flask运行时是不止一个进程实例的,你要指定上下文它才知道该在哪个实例里面找相关的信息。
同样的,如果在使用flask的路由函数中需要使用到全局的可变变量,也需要 with app.app_context():