如果您打算仅使用一个应用程序,则可以在很大程度上跳过本章。只要将您的应用程序传递给SQLAlchemy
构造函数,就可以设置好了。但是,如果要使用多个应用程序,或者要在要读取的功能中动态创建该应用程序。
如果您在函数中定义应用程序,但在SQLAlchemy
全局对象中定义,则后者如何了解前者?答案是init_app()
函数:
from flask import Flask from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() def create_app(): app = Flask(__name__) db.init_app(app) return app
它所做的是准备要使用的应用程序 SQLAlchemy
。但是,这现在并未将SQLAlchemy
对象绑定 到您的应用程序。为什么不这样做呢?因为可能创建了多个应用程序。
那么如何SQLAlchemy
了解您的应用程序呢?您将必须设置一个应用程序上下文。如果您在Flask视图功能或CLI命令中进行操作,则会自动发生。但是,如果您在交互式外壳中工作,则必须自己进行操作(请参阅创建应用程序上下文)。
如果您尝试在应用程序上下文之外执行数据库操作,则会看到以下错误:
找不到应用程序。在视图函数内部工作或推送应用程序上下文。
简而言之,执行以下操作:
>>> from yourapp import create_app >>> app = create_app() >>> app.app_context().push()
或者,使用with语句来完成设置和拆卸:
def my_function(): with app.app_context(): user = db.User(...) db.session.add(user) db.session.commit()
Flask-SQLAlchemy内部的一些函数还可以选择接受应用程序以对其进行操作:
>>> from yourapp import db, create_app >>> db.create_all(app=create_app())