这与Flask的应用程序上下文有关。使用初始化时db.init_app(app)
,Flask- sqlAlchemy不知道哪个应用程序是“当前”应用程序(请记住,Flask允许在同一解释器中使用多个应用程序)。您可能有多个应用程序sqlAlchemy
在同一进程中使用相同的实例,并且Flask- sqlAlchemy将需要知道哪个是“当前”应用程序(由于Flask的上下文上下文是所有事物的本地性质)。
如果需要在运行时执行此操作,则必须明确说明哪个应用程序是所有调用的“当前”应用程序。您可以通过将代码更改为使用with app.app_context()
块来做到这一点:
def create_app():
app = flask.Flask("app")
app.config['sqlALCHEMY_DATABASE_URI'] = 'sqlite://'
app.register_blueprint(api)
db.init_app(app)
with app.app_context():
# Extensions like Flask-sqlAlchemy Now kNow what the "current" app
# is while within this block. Therefore, you can Now run........
db.create_all()
return app
如果要编写需要应用程序上下文的独立脚本,则可以在开始时推送上下文,而不是将所有内容放在一个with
块中。
create_app().app_context().push()