Superset 0.38.0部署报错sqlalchemy.exc.InvalidRequestError如何解决?
问题根因
该报错属于SQLAlchemy的典型类映射初始化顺序问题:Alert模型中声明了和Slice类的关联关系,但SQLAlchemy执行映射器配置时,Alert类先被加载初始化,此时Slice类还未被导入到SQLAlchemy的映射上下文中,导致无法识别Slice对应的映射类。
解决方案
以下方案优先级从高到低排列,优先使用方案1适配Superset 0.38版本:
方案1:调整模型导入与关联声明
Superset 0.38版本中Alert模型定义在superset/models/alerts.py,Slice模型定义在superset/models/slice.py,按如下步骤修改即可:
- 在
alerts.py文件顶部显式导入Slice类:
from superset.models.slice import Slice
- 调整Alert类中的关联声明,将字符串引用改为直接引用类对象:
# 修改前 slice = relationship("Slice", backref="alerts", foreign_keys=[slice_id]) # 修改后 slice = relationship(Slice, backref="alerts", foreign_keys=[slice_id])
方案2:开启关联延迟解析
如果不想调整导入顺序,可以给关联声明添加late参数,让SQLAlchemy在所有映射类加载完成后再解析关联:
slice = relationship("Slice", backref="alerts", foreign_keys=[slice_id], late=True)
方案3:调整模型加载顺序
如果自定义改造过Superset初始化逻辑,确保应用启动时superset.models.slice模块的加载顺序早于superset.models.alerts模块,在DB初始化前先导入Slice类即可。
验证操作
修改完成后执行superset init命令重新初始化元数据,再启动服务访问/health接口,返回200状态码即代表问题解决。
内容的提问来源于stack exchange,提问作者Amrit
相关产品推荐
相关产品推荐

