DevGang
Авторизоваться

FlaskSQLAlchemy

Расширение для поддержки 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())
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться