由于急于加载布局,我在管理数据库迁移时遇到问题。在我的配置中,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()
。这样,我就可以返回没有Dash的Flask应用程序flask db migrate
,flask db upgrade
register_dashapps(app)
并运行应用程序另一种可能的解决方案是在try/except
函数内添加register_dashapp
。但是我觉得这不是最好的解决方案。
也许最好的解决方案是仅在flask cli命令为register_dashapp()
时运行方法flask run
。是否可以编辑Flask cli的运行命令?