Расширение для поддержки SQLAlchemy в Flask
Если вы планируете использовать только одно приложение, вы можете пропустить эту главу. Просто передайте ваше приложение конструктору 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 view или команды CLI, это происходит автоматически. Однако, если вы работаете в интерактивной оболочке, вам придется сделать это самостоятельно.
Если вы попытаетесь выполнить операции с базой данных вне контекста приложения, вы увидите следующую ошибку:
No application found. Either work inside a view function or push an application context.
В двух словах, сделайте что-то вроде этого:
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())