设置开发环境
本节文档是关于如何运行 Superset 的各种方法的知识拼凑(docker compose、仅使用 "docker"、在 "裸机" 上运行,使用 Makefile)。
现在我们更积极地推荐和支持使用 docker compose 作为运行 Superset 进行开发的主要方式,以保持你的理智。大多数人应该坚持阅读前几部分 - ("Fork & Clone"、"docker compose" 和 "安装开发工具")
Fork 和 Clone
首先,在 GitHub 上 fork 仓库,然后克隆它。
其次,你可以直接克隆主仓库,但你将无法发送拉取请求。
git clone git@github.com:your-username/superset.git
cd superset
docker compose(推荐!)
设置环境以在 Superset 的任何部分中挤入一个 "hello world" 应该像这样简单:
docker compose up
注意:
- 这将拉取/构建 Docker 镜像并运行一系列服务,包括:
- 一个 Superset Flask 网络服务器,挂载本地 Python 仓库/代码
- 一个 Superset Celery 工作进程,也挂载本地 Python 仓库/代码
- 一个 Superset Node 服务,挂载、编译和打包 JS/TS 资产
- 一个 Superset Node websocket 服务,为异步后端提供动力
- Postgres 作为元数据数据库,并存储示例数 据集、图表和仪表板,这些应在启动时填充
- Redis 作为我们异步后端和缓存后端的消息队列
- 它将在首次启动时将示例加载到数据库中
- 所有其他细节和指针可在 docker-compose.yml 中找到
- 本地仓库挂载在服务中,这意味着更新主机上的代码将在 Docker 镜像中反映出来
- Superset 在 localhost:8088/ 提供服务
- 你可以使用 admin/admin 登录
安装开发工具
虽然 docker compose 简化了大部分设置,但你仍然需要在本地设置许多东西来为你的 IDE 提供动力,比如提交钩子、代码检查工具和测试运行器。请注意,你可以使用 docker compose exec superset_app bash 等命令在 Docker 镜像中执行这些操作,但许多人喜欢从主机运行这些工具。
Python 环境
假设你已经有设置 Python 环境的方法,比如 pyenv、virtualenv 或其他工具,你只需要安装我们的开发、固定的 Python 需求包:
pip install -r requirements/development.txt
Git Hooks
Superset 使用 pre-commit 提供的 Git 预提交钩子。要安装,请运行以下命令:
pre-commit install
这将在你的本地仓库中安装钩子。从现在开始,每次你进行 Git 提交时,都会自动运行一系列检查。
手动运行 Pre-commit
你也可以通过多种方式手动运行预提交检查:
-
在所有文件上运行 pre-commit(与 CI 相同):
要在你仓库中的所有文件上运行预提交检查,请使用以下命令:
pre-commit run --all-files这与在 CI 期间运行的检查集相同,确保你的更改符合项目的标准。
-
在特定文件上运行 pre-commit:
如果你想检查或修复特定文件,可以通过指定文件路径来实现:
pre-commit run --files path/to/your/file.py这将仅在你指定的文件上运行检查。
-
运行特定的 pre-commit 检查:
要在所有文件或特定文件上运行特定的检查(钩子),请使用以下命令:
pre-commit run <hook_id> --all-files或对于特定文件:
pre-commit run <hook_id> --files path/to/your/file.py将
<hook_id>替换为你想要运行的特定钩子的 ID。你可以在.pre-commit-config.yaml文件中找到可用钩子的列表。
docker compose 的替代方案
这部分文档是关于在没有 docker compose 的情况下设置开发环境的信息拼凑,并且文档/支持程度各不相同。
::: 警告
Superset 支持多种安装方法,但这些方法的维护和跨环境功能保障一直是个难题。
Flask 服务器
操作系统依赖
在执行以下步骤之前,请确保您的机器满足 操作系统依赖。 您还需要安装 MySQL。
确保您使用的是 Python 3.9、3.10 或 3.11 版本,然后继续执行以下操作:
# 创建并激活虚拟环境(推荐)
python3 -m venv venv # 设置 python3 虚拟环境
source venv/bin/activate
# 安装外部依赖
pip install -r requirements/development.txt
# 以可编辑(开发)模式安装 Superset
pip install -e .
# 初始化数据库
superset db upgrade
# 在元数据数据库中创建管理员用户(使用 `admin` 作为用户名以便加载示例)
superset fab create-admin
# 创建默认角色和权限
superset init
# 加载一些数据以供使用。
# 注意:您必须先前已创建用户名为 `admin` 的管理员用户,此命令才能生效。
superset load-examples
# 从虚拟环境中启动 Flask 开发服务器。
# 注意:此时您的页面可能没有 CSS。
# 请参阅以下说明如何构建前端资源。
superset run -p 8088 --with-threads --reload --debugger --debug
或者您可以通过我们的 Makefile 进行安装
# 创建并激活虚拟环境(推荐)
$ python3 -m venv venv # 设置 python3 虚拟环境
$ source venv/bin/activate
# 安装 pip 包 + 预提交
$ make install
# 仅安装 superset pip 包并设置环境
$ make superset
# 仅设置预提交
$ make pre-commit
注意:FLASK_APP 环境变量通常不需要设置,因为它目前由 .flaskenv 控制,但如果需要,应设置为 superset.app:create_app()
如果您对 FAB 管理的模板进行了更改,这些模板与较新的、由 React 驱动的前端资源构建方式不同,您需要在不带 --with-threads 参数的情况下启动应用,如下所示:
superset run -p 8088 --reload --debugger --debug
依赖项
如果您添加了新的依赖项或更新了现有依赖项(根据 setup.py 中的 install_requires 部分),您必须重新编译(冻结)Python 依赖项,以确保 CI、测试等构建是确定的。这可以通过以下方式实现:
$ python3 -m venv venv
$ source venv/bin/activate
$ python3 -m pip install -r requirements/development.txt
$ pip-compile-multi --no-upgrade
当升级单个包的版本号时,您应使用 -P 标志运行 pip-compile-multi:
$ pip-compile-multi -P my-package
要根据 setup.py 和 requirements/*.in 中定义的限制将所有依赖项更新到最新版本,请不带任何标志运行 pip-compile-multi:
$ pip-compile-multi
这应定期进行,但建议对应用程序进行彻底的手动测试,以确保没有引入单元和集成测试未捕获的破坏性更改。
日志记录到浏览器控制台
此功能仅在 Python 3 上可用。在调试应用程序时,您可以使用 ConsoleLog 包将服务器日志直接发送到浏览器控制台。您需要通过在 config.py 或 superset_config.py 中添加以下内容来修改应用:
from console_log import ConsoleLog
def FLASK_APP_MUTATOR(app):
app.wsgi_app = ConsoleLog(app.wsgi_app, app.logger)
然后确保使用正确的 worker 类型运行 WSGI 服务器:
gunicorn "superset.app:create_app()" -k "geventwebsocket.gunicorn.workers.GeventWebSocketWorker" -b 127.0.0.1:8088 --reload
您可以将任何内容记录到浏览器控制台,包括对象:
from superset import app
app.logger.error('发生了一个异常!')
app.logger.info(form_data)
前端
前端资源(TypeScript、JavaScript、CSS 和图像)必须编译才能正确显示 Web UI。superset-frontend 目录包含所有由 NPM 管理的前端资源。请注意,对于某些遗留页面,还有额外的由 Flask-Appbuilder 捆绑的前端资源(例如 jQuery 和 bootstrap)。这些资源不由 NPM 管理,未来可能会逐步淘汰。
先决条件
nvm 和 node
首先,请确保您使用的是以下版本的 Node.js 和 npm:
Node.js:版本 20npm:版本 10
我们推荐使用 nvm 来管理您的 node 环境:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.0/install.sh | bash
如果显示'-bash: nvm: command not found'
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # 这会加载nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # 这会加载nvm的bash补全
cd superset-frontend
nvm install --lts
nvm use --lts
或者,如果你使用的是从 Catalina 开始的默认 macOS shell zsh,可以尝试:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.0/install.sh)"
对于感兴趣的人,你也可以尝试使用 avn 来自动切换到运行 Superset 前端所需的 Node 版本。
安装依赖
通过以下命令安装 package.json 中列出的第三方依赖:
# 从仓库的根目录
cd superset-frontend
# 从 `package-lock.json` 安装依赖
npm ci
请注意,Superset 使用 Scarf 来捕获关于安装版本的遥测/分析数据,包括 scarf-js npm 包和一个分析像素。如本文档其他地方所述,Scarf 收集聚合统计数据以用于安全/发布策略,并且不会捕获/保留个人身份信息(PII)。你可以在这里 阅读关于 scarf-js 包的信息,以及各种选择退出的方式,但你也可以通过将 SCARF_ANALYTICS 环境变量设置为 false 来选择退出 npm 包和像素,或者通过在 superset-frontent/package.json 中添加以下设置来选择退出像素:
// your-package/package.json
{
// ...
"scarfSettings": {
"enabled": false
}
// ...
}
构建资源
你可以构建三种类型的资源:
npm run build:生产资源,CSS/JSS 被压缩和优化npm run dev-server:本地开发资源,支持源映射和热刷新npm run build-instrumented:用于收集 Cypress 测试代码覆盖率的插桩应用程序代码
如果在使用上述命令时遇到与文件监视器限制相关的错误:
Error: ENOSPC: System limit for number of file watchers reached
该错误是由于系统监控的文件数量达到了限制。你可以通过增加 inotify 监视器的数量来解决此错误。
当前的 max watches 值可以通过以下命令查看:
cat /proc/sys/fs/inotify/max_user_watches
编辑文件 /etc/sysctl.conf 以增加此值。该值需要根据系统内存来决定(参见此 StackOverflow 回答以获取更多上下文)。
在编辑器中打开文件并在底部添加一行以指定 max watches 值。
fs.inotify.max_user_watches=524288
保存文件并退出编辑器。要确认更改成功,请运行以下命令以从 sysctl.conf 加载更新的 max_user_watches 值:
sudo sysctl -p
Webpack 开发服务器
开发服务器默认在 http://localhost:9000 启动,并将后端请求代理到 http://localhost:8088。
因此,典型的开发工作流程如下:
-
使用 Flask 在本地运行 Superset,端口为
8088—— 但不要直接访问它,# 安装 Superset 及其依赖,并加载你的虚拟环境,如上所述。
superset run -p 8088 --with-threads --reload --debugger --debug -
同时,在本地端口
9000上运行 Webpack 开发服务器,npm run dev-server -
在浏览器中访问
http://localhost:9000(Webpack 服务器,而不是 Flask)。这将使用 Webpack 开发服务器中的热重载前端资源,同时将后端查询重定向到 Flask/Superset:你在 Superset 代码库中的更改——无论是前端还是后端——都会在浏览器中实时反映。
可以更改 Webpack 服务器设置:
# 在 http://localhost:9000 启动开发服务器
npm run dev-server
# 在非默认端口上运行开发服务器
npm run dev-server -- --port=9001
# 将后端请求代理到在非默认端口上运行的 Flask 服务器
npm run dev-server -- --env=--supersetPort=8081
# 代理到远程后端但提供本地资源
npm run dev-server -- --env=--superset=https://superset-dev.example.com
--superset= 选项在你想要调试生产问题或必须在防火墙后设置 Superset 时非常有用。它允许你在另一个环境中运行 Flask 服务器,同时保持本地构建资源以获得最佳的开发者体验。
其他 npm 命令
另外,你可能还会发现以下 NPM 命令很有用:
npm run build-dev:以开发模式构建资源。npm run dev:以监视模式构建开发资源,文件更改时会自动重新构建
Docker(docker compose)
查看文档 这里
更新 NPM 包
按照规定的方式使用 npm,确保 superset-frontend/package-lock.json 根据 npm 规定的最佳实践进行更新。
功能标志
Superset 支持一个服务器范围的功能标志系统,这有助于功能的增量开发。要添加一个新的功能标志,只需在 superset_config.py 中进行如下修改:
FEATURE_FLAGS = {
'SCOPED_FILTER': True,
}
如果你想在客户端代码中使用相同的标志,还需要将其添加到 @superset-ui/core 中的 FeatureFlag TypeScript 枚举中。例如:
export enum FeatureFlag {
SCOPED_FILTER = "SCOPED_FILTER",
}
superset/config.py 包含 DEFAULT_FEATURE_FLAGS,它将被 superset_config.py 中 FEATURE_FLAGS 下指定的内容覆盖。例如,superset/config.py 中的 DEFAULT_FEATURE_FLAGS = { 'FOO': True, 'BAR': False } 和 superset_config.py 中的 FEATURE_FLAGS = { 'BAR': True, 'BAZ': True } 将导致合并的功能标志为 { 'FOO': True, 'BAR': True, 'BAZ': True }。
每个标志的当前可用性状态(稳定 vs 测试等)可以在 RESOURCES/FEATURE_FLAGS.md 中找到。
Git Hooks
Superset 使用 pre-commit 提供的 Git 预提交钩子。要安装,请运行以下命令:
pip3 install -r requirements/development.txt
pre-commit install
现在,当你进行 git 提交时,将运行一系列检查。
或者,可以通过 tox 运行 pre-commit:
tox -e pre-commit
或者手动运行 pre-commit:
pre-commit run --all-files
Linting
Python
我们使用 Pylint 进行 linting,可以通过以下方式调用:
# for python
tox -e pylint
关于最佳实践,请避免全局禁用 Pylint 消息(通过 .pylintrc)或在文件头部的顶级禁用,尽管有一些例外。禁用应该在行内进行,因为它可以防止掩盖问题,并提供禁用该消息的原因的上下文。
此外,Python 代码使用 Black 进行自动格式化,它被配置为预提交钩子。还有许多 编辑器集成。
TypeScript
cd superset-frontend
npm ci
# run eslint checks
npm run eslint -- .
# run tsc (typescript) checks
npm run type
如果使用带有 vscode 的 eslint 扩展,请在你的工作区 settings.json 文件中放入以下内容:
"eslint.workingDirectories": [
"superset-frontend"
]
Testing
Python Testing
所有 Python 测试都在 tox 这个标准化的测试框架中进行。所有 Python 测试都可以通过 tox 的 环境 运行,例如:
tox -e <environment>
例如:
tox -e py38
或者,你可以通过以下方式运行单个文件中的所有测试:
tox -e <environment> -- tests/test_file.py
或者通过以下方式运行特定测试:
tox -e <environment> -- tests/test_file.py::TestClassName::test_method_name
请注意,测试环境使用临时目录来定义 SQLite 数据库,这些数据库将在每次调用测试命令组之前被清除。
Superset 代码库中还包含一个实用脚本来运行 Python 集成测试。README 可以在这里找到。
例如,要运行所有集成测试,请从根目录运行此脚本:
scripts/tests/run.sh
你可以使用 pytest 运行在 './tests/unit_tests' 中找到的单元测试。这是一种运行不需要任何数据库设置的孤立测试的简单方法:
pytest ./link_to_test.py
Frontend Testing
我们使用 Jest 和 Enzyme 来测试 TypeScript/JavaScript。可以通过以下方式运行测试:
cd superset-frontend
npm run test
要运行单个测试文件:
npm run test -- path/to/file.js
Integration Testing
我们使用 Cypress 进行集成测试。可以通过 tox -e cypress 运行测试。要打开 Cypress 并探索测试,首先设置并运行测试服务器:
export SUPERSET_CONFIG=tests.integration_tests.superset_test_config
export SUPERSET_TESTENV=true
export CYPRESS_BASE_URL="http://localhost:8081"
superset db upgrade
superset load_test_users
superset load-examples --load-test-data
superset init
superset run --port 8081
运行 Cypress 测试:
cd superset-frontend
npm run build-instrumented
cd cypress-base
npm install
# 通过无头 Chrome 浏览器运行测试(需要 Chrome 64+)
npm run cypress-run-chrome
# 运行特定文件的测试
npm run cypress-run-chrome -- --spec cypress/e2e/explore/link.test.ts
# 运行特定文件并启用视频录制
npm run cypress-run-chrome -- --spec cypress/e2e/dashboard/index.test.js --config video=true
# 打开 Cypress UI
npm run cypress-debug
# 将 Cypress 指向非默认 URL(http://localhost:8088),在运行脚本前设置环境变量
# 例如,CYPRESS_BASE_URL="http://localhost:9000"
CYPRESS_BASE_URL=<your url> npm run cypress open
参见 superset-frontend/cypress_build.sh。
作为替代方案,您可以使用 docker compose 环境进行测试:
确保您已在 /etc/hosts 文件中添加了以下行:
127.0.0.1 db
如果您已经启动了 Docker 环境,请使用以下命令确保数据库实例是全新的:
docker compose down -v
启动环境:
CYPRESS_CONFIG=true docker compose up
它将在端口 8088 上提供后端和前端服务。
运 行 Cypress 测试:
cd cypress-base
npm install
npm run cypress open
调试服务器应用
本地调试
要使用 VSCode 在本地调试,您可以配置一个启动配置文件 .vscode/launch.json,例如:
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Flask",
"type": "python",
"request": "launch",
"module": "flask",
"env": {
"FLASK_APP": "superset",
"SUPERSET_ENV": "development"
},
"args": ["run", "-p 8088", "--with-threads", "--reload", "--debugger"],
"jinja": true,
"justMyCode": true
}
]
}
原始 Docker(不使用 docker compose)
按照以下说明调试在 Docker 容器内运行的 Flask 应用。请注意,这将运行一个基础的 Superset Web 服务器。
首先将以下内容添加到 ./docker-compose.yaml 文 件中:
superset:
env_file: docker/.env
image: *superset-image
container_name: superset_app
command: ["/app/docker/docker-bootstrap.sh", "app"]
restart: unless-stopped
+ cap_add:
+ - SYS_PTRACE
ports:
- 8088:8088
+ - 5678:5678
user: "root"
depends_on: *superset-depends-on
volumes: *superset-volumes
environment:
CYPRESS_CONFIG: "${CYPRESS_CONFIG}"
像往常一样启动 Superset:
docker compose up
将所需的库和包安装到 Docker 容器中:
进入 superset_app 容器:
docker exec -it superset_app /bin/bash
root@39ce8cf9d6ab:/app#
在容器内运行以下命令:
apt update
apt install -y gdb
apt install -y net-tools
pip install debugpy
找到 Flask 进程的 PID。确保使用第一个 PID。每次更改 Python 代码时,Flask 应用都会重新生成一个子进程。因此,使用第一个 PID 非常重要。
ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:09 ? 00:00:00 bash /app/docker/docker-bootstrap.sh app
root 6 1 4 14:09 ? 00:00:04 /usr/local/bin/python /usr/bin/flask run -p 8088 --with-threads --reload --debugger --host=0.0.0.0
root 10 6 7 14:09 ? 00:00:07 /usr/local/bin/python /usr/bin/flask run -p 8088 --with-threads --reload --debugger --host=0.0.0.0
将 debugpy 注入正在运行的 Flask 进程中。在此例中,PID 为 6。
python3 -m debugpy --listen 0.0.0.0:5678 --pid 6
验证 debugpy 是否在端口 5678 上监听:
netstat -tunap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:5678 0.0.0.0:* LISTEN 462/python
tcp 0 0 0.0.0.0:8088 0.0.0.0:* LISTEN 6/python
现在您可以附加调试器到该进程。使用 VSCode,您可以配置一个启动配置文件 .vscode/launch.json,如下所示:
{
"version": "0.2.0",
"configurations": [
{
"name": "Attach to Superset App in Docker Container",
"type": "python",
"request": "attach",
"connect": {
"host": "127.0.0.1",
"port": 5678
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "/app"
}
]
}
]
}
VSCode 不会立即在断点处停止。我们已经附加到 PID 6,但它还不知道任何子进程。为了“唤醒”调试器,您需要修改一个 Python 文件。这将触发 Flask 重新加载代码并创建一个新的子进程。VSCode 将检测到这个新子进程,断点将被激活。
在 Kubernetes 环境中调试服务器应用
要调试在 Kubernetes 集群内的 POD 中运行的 Flask,您需要确保 POD 以 root 身份运行并被授予 SYS_TRACE 能力。这些设置不应在生产环境中使用。
securityContext:
capabilities:
add: ["SYS_PTRACE"]
有关更多详细信息,请参见 为容器设置能力。
一旦 POD 以 root 身份运行并具有 SYS_PTRACE 能力,它将能够调试 Flask 应用。
你可以按照与 docker compose 中相同的步骤进行操作。进入 pod 并安装所需的库和包;gdb、netstat 和 debugpy。
在 Kubernetes 环境中,节点通常无法从集群外部访问。因此,VSCode 将无法远程连接到 Kubernetes 节点上的端口 5678。为了实现这一点, 你需要创建一个将 5678 端口转发到本地机器的隧道。
kubectl port-forward pod/superset-<some random id> 5678:5678
现在,你可以使用与上述相同的配置启动 VSCode 调试器。VSCode 将连接到 127.0.0.1:5678,该端口由 kubectl 转发到远程 Kubernetes POD。
Storybook
Superset 包含一个 Storybook,用于预览各种 Superset 组件的布局/样式及其变体。要打开并查看 Storybook:
cd superset-frontend
npm run storybook
在为 Superset 贡献新的 React 组件时,请尝试在组件的 jsx/tsx 文件旁边添加一个 Story。
提示
添加新数据源
-
为数据源创建模型和视图,将它们添加到 superset 文件夹下,例如一个新的 my_models.py,其中包含集群、数据源、列和指标的模型,以及 my_views.py,其中包含 clustermodelview 和 datasourcemodelview。
-
为新模型创建数据库迁移文件
-
在 config.py 中指定此变量,以添加数据源模型及其所属模块:
例如:
ADDITIONAL_MODULE_DS_MAP = {'superset.my_models': ['MyDatasource', 'MyOtherDatasource']}这意味着它将在源注册表中注册 superset.my_models 模块中的 MyDatasource 和 MyOtherDatasource。
可视化插件
关于编写新插件的主题,无论你是否希望将其贡献回 来,都已在文档和这篇博客文章中得到了很好的记录。
要向 Superset 贡献插件,你的插件必须满足以下条件:
- 插件应适用于广大社区,而不是特别专业的用例
- 插件应使用 TypeScript 编写
- 插件应包含足够的单元/e2e 测试
- 插件应使用适当的命名空间,例如文件夹名为
plugin-chart-whatever,包名为@superset-ui/plugin-chart-whatever - 插件应通过 Emotion 使用主题变量,这些变量由 ThemeProvider 传递
- 插件应提供足够的错误处理(无数据返回、格式错误的数据、无效的控件等)
- 插件应包含以
README.md文件形式提供的文档 - 插件应具有有意义且唯一的图标
- 最重要的是,插件应由原作者(们)承诺进行维护
提交将根据具体情况考虑是否接受(或移除)。
添加数据库迁移
-
更改你想要修改的模型。此示例将添加一个
Column注释模型。 -
生成迁移文件
superset db migrate -m 'add_metadata_column_to_annotation_model'这将在
migrations/version/{SHA}_this_will_be_in_the_migration_filename.py中生成一个文件。 -
升级数据库
superset db upgrade输出应如下所示:
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
INFO [alembic.runtime.migration] Running upgrade 1a1d627ebd8e -> 40a0a483dd12, add_metadata_column_to_annotation_model.py -
将列添加到视图中
由于有一个新列,我们需要将其添加到 AppBuilder 模型视图中。
-
测试迁移的
down方法superset db downgrade输出应如下所示:
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume transactional DDL.
INFO [alembic.runtime.migration] Running downgrade 40a0a483dd12 -> 1a1d627ebd8e, add_metadata_column_to_annotation_model.py
合并数据库迁移
当两个数据库迁移发生冲突时,你会收到类似以下的错误消息:
alembic.util.exc.CommandError: Multiple head revisions are present for
given argument 'head'; please specify a specific target
revision, '<branchname>@head' to narrow to a specific head,
or 'heads' for all heads`
要修复它:
-
获取迁移头
superset db heads这将列出两个或更多的迁移哈希。例如:
1412ec1e5a7b (head)
67da9ef1ef9c (head)
-
选择其中一个作为父修订版本,打开另一个修订版本的脚本,并更新
Revises和down_revision为新的父修订版本。例如:--- a/67da9ef1ef9c_add_hide_left_bar_to_tabstate.py
+++ b/67da9ef1ef9c_add_hide_left_bar_to_tabstate.py
@@ -17,14 +17,14 @@
"""add hide_left_bar to tabstate
Revision ID: 67da9ef1ef9c
-Revises: c501b7c653a3
+Revises: 1412ec1e5a7b
Create Date: 2021-02-22 11:22:10.156942
"""
# revision identifiers, used by Alembic.
revision = "67da9ef1ef9c"
-down_revision = "c501b7c653a3"
+down_revision = "1412ec1e5a7b"
import sqlalchemy as sa
from alembic import op或者,您也可以运行
superset db merge来创建一个仅用 于合并头部的迁移脚本。superset db merge {HASH1} {HASH2} -
将数据库升级到新的检查点
superset db upgrade