У меня проблема с управлением миграцией БД из-за стремительной загрузки макетов. В моей конфигурации 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.
Обходной путь:
- Комментарий
register_dashapps(app)
внутри create_app()
. Таким образом, я возвращаю приложение Flask без Dash - Измените базу данных, выполнив:
flask db migrate
, flask db upgrade
- Раскомментируйте
register_dashapps(app)
и запустите приложение
Другое возможное решение - добавить функцию try/except
в register_dashapp
. Однако я не думаю, что это лучшее решение.
Вероятно, лучшим решением является запуск метода register_dashapp()
, только если команда flask cli установлена на flask run
. Есть ли возможность отредактировать команду запуска в Flask cli?