Введение в Contexts

Если вы планируете использовать только одно приложения, тогда можете пропустить эту статью. Просто передайте приложение в конструктор 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, это происходит автоматически. Однако если вы работаете в интерактивной оболочке - вам придется сделать это вручную (смотрите Creating 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())

Оригинал этой страницы