Flask-migrate не совместим с загрузкой макетов Dash Eager - PullRequest
0 голосов
/ 21 октября 2019

У меня проблема с управлением миграцией БД из-за стремительной загрузки макетов. В моей конфигурации Dash выполняет db-запросы для создания макета перед выполнением миграции. Затем, если в схеме БД произошли изменения, все эти запросы вызовут исключение.

Мое приложение структурировано следующим образом:

В __init__.py проекта естьcreate_app(), который вызывает функцию register_dashapp():

def create_app():
    log.debug('creating app')
    app = Flask(__name__)
    log.debug('loading conf')
    app.config.from_object(BaseConfig)
    log.debug('register extensions')
    register_extensions(app)
    log.debug('register blueprints')
    register_blueprints(app)
    log.debug('register dashapp')

    register_dashapps(app)
    return app


def register_dashapps(app):
    from app.shap_dashboard.base_layout import get_layout
    from app.shap_dashboard.base_callbacks import register_callbacks

    dash_app_config=DashAppConfigurations()
    for page_logical_name, config in dash_app_config.config.items():
        print(page_logical_name)

        dashapp1 = dash.Dash(__name__,
                             server=app,
                             url_base_pathname='/' + config['URL'] + '/',
                             assets_folder=get_root_path(__name__) + '/shap_dashboard/assets/',
                             # meta_tags=[meta_viewport],
                             suppress_callback_exceptions=False,
                             )


        with app.app_context():
            dashapp1.title = page_logical_name

            dashapp1.layout = get_layout()
            register_callbacks(dashapp1, config)

Функция register_dashapps вызывает get_layout (), который зависит от некоторых запросов к базе данных:

def get_layout():
    html.Div([x.name for x in db.session.query(Players).all()])

Структура таблицыопределено в файле model.py:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

class Players(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), index=True, unique=True)
    number = db.Column(db.Integer)
    role = db.Column(db.String(128))

Мне нужно добавить столбец в таблицу игроков (т.е. отредактировать класс Players, затем запустить flask db migrate и flask db upgrade). В этой конфигурации процесс не удастся, потому что запрос БД внутри get_layout не удастся. Действительно, если я изменю класс Players, я больше не смогу создавать приложение Flask.

Обходной путь:

  1. Комментарий register_dashapps(app) внутри create_app(). Таким образом, я возвращаю приложение Flask без Dash
  2. Измените базу данных, выполнив: flask db migrate, flask db upgrade
  3. Раскомментируйте register_dashapps(app) и запустите приложение

Другое возможное решение - добавить функцию try/except в register_dashapp. Однако я не думаю, что это лучшее решение.

Вероятно, лучшим решением является запуск метода register_dashapp(), только если команда flask cli установлена ​​на flask run. Есть ли возможность отредактировать команду запуска в Flask cli?

...