используя flask-migrate с flask-script и фабрикой приложений

Я создаю фляжное приложение и на этот раз решил попробовать подход фабрики приложений, но у меня возникли проблемы с фляжной миграцией и я не могу найти простое решение.

Обратите внимание, что я хочу передать местоположение конфигурации в качестве опции скрипта.

управлять.py:

manager = Manager(create_app)
manager.add_option("-c", "--config", dest="config_module", required=False)

затем мне нужно создать экземпляр миграции и добавить команду в диспетчер:

with manager.app.app_context():
    migrate = Migrate(current_app, db)
    manager.add_command('db', MigrateCommand)

но экземпляр приложения еще не создан, поэтому он не работает

Я знаю, что могу передать конфигурацию в переменную среды и создать приложение перед созданием экземпляра менеджера, но как это сделать с помощью параметров менеджера?


person ETK    schedule 26.04.2015    source источник


Ответы (1)


Когда вы используете опцию --config, вы должны использовать функцию фабрики приложений, как вы знаете, поскольку эта функция получает конфигурацию в качестве аргумента, что позволяет вам создать приложение с правильной конфигурацией.

Поскольку у вас есть фабрика приложений, вы должны использовать отложенную инициализацию для всех ваших расширений. Вы создаете экземпляры своих расширений без передачи каких-либо аргументов, а затем в функции фабрики приложений после создания приложения вы вызываете init_app для всех своих расширений, передавая приложение и базу данных теперь, когда они у вас есть.

MigrateCommand полностью отделен от этого, вы можете добавить его к Manager без создания экземпляров приложения и базы данных.

Пример:

управлять.py:

from app import create_app
from flask_migrate import MigrateCommand, Manager

manager = Manager(create_app)
manager.add_option("-c", "--config", dest="config_module", required=False)
manager.add_command('db', MigrateCommand)

app.py (или как называется ваш модуль фабрики приложений)

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

db = SQLAlchemy()
migrate = Migrate()

def create_app(config):
    app = Flask(__name__)
    # apply configuration
    # ...

    # initialize extensions
    db.init_app(app)
    migrate.init_app(app, db)

    return app
person Miguel    schedule 26.04.2015
comment
Ты уверен, что твой пример работает, Мигель? Я получаю пустые миграции здесь. - person Italo Maia; 18.06.2015
comment
Получаете ли вы действительные миграции, если используете Alembic напрямую? Я предполагаю, что ваша проблема не связана с настройкой Flask-Script. - person Miguel; 18.06.2015
comment
@ItaloMaia Я знаю, что это старо, но я также получаю пустые миграции. Как вы решили проблему? - person Firdaus Indradhirmaya; 27.06.2021