跳过到主要内容
在 GitHub 上编辑此页面

设置开发环境

本节中的文档是关于运行 Superset 的各种方法(docker compose、仅“docker”、“metal”、使用 Makefile)的知识拼凑而成。

注意

现在我们已经发展到更积极地推荐和支持 docker compose 作为运行 Superset 进行开发和保持理智的主要方式。大多数人应该坚持前几节 - (“Fork & Clone”、“docker compose”和“安装开发工具”)

Fork 和 Clone

首先,在 GitHub 上 fork 仓库,然后克隆它。

其次,您可以直接克隆主仓库,但您将无法发送拉取请求。

git clone [email protected]:your-username/superset.git
cd superset

将事物设置好,以便将一个“hello world”挤入 Superset 的任何部分,应该像这样简单

docker compose up

请注意

  • 这将拉取/构建 docker 镜像并运行一组服务,包括
    • 一个 Superset Flask web 服务器,挂载本地 python 仓库/代码
    • 一个 Superset Celery worker,也挂载本地 python 仓库/代码
    • 一个 Superset Node 服务,挂载、编译和捆绑 JS/TS 资产
    • 一个 Superset Node websocket 服务,为异步后端提供支持
    • Postgres 作为元数据数据库,用于存储示例数据集、图表和仪表板,这些数据集、图表和仪表板应该在启动时填充
    • Redis 作为我们异步后端的队列和缓存后端
  • 它将在第一次启动时将示例加载到数据库中
  • 所有其他详细信息和指针在 docker-compose.yml 中提供
  • 本地仓库被挂载在服务中,这意味着在主机上更新代码将反映在 docker 镜像中
  • Superset 在 localhost:8088/ 上提供服务
  • 您可以使用 admin/admin 登录
注意

superset-node 中安装和构建 Apache Superset 的 Node 模块可能需要相当长的时间。这在依赖项很大时是正常的。请耐心等待进程完成,因为长时间等待并不意味着您的设置有问题。如果延迟似乎过长,请检查您的互联网连接或系统资源。

警告

由于 docker compose 主要设计用于在一台主机上运行一组容器,并且因此无法可靠地支持高可用性,因此我们不支持也不建议使用我们的 docker compose 结构来支持生产型用例。对于单台主机环境,我们建议使用 minikube 以及我们的 在 k8s 上安装 文档,配置为安全。

安装开发工具

注意

虽然 docker compose 简化了许多设置,但仍然有很多东西您需要在本地设置,以支持您的 IDE,以及提交钩子linters测试运行器等。请注意,您可以在 docker 镜像中使用类似 docker compose exec superset_app bash 的命令来执行这些操作,但许多人更喜欢从主机运行这些工具。

Python 环境

假设您已经有一种方法来设置您的 python 环境,例如 pyenvvirtualenv 或其他,您需要做的就是安装我们的 dev,固定 python 依赖项包

pip install -r requirements/development.txt

Git 钩子

Superset 使用 Git 预提交钩子,这些钩子由 pre-commit 提供。要安装,请运行以下命令

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 的情况下设置开发环境相关的信息的拼凑而成,并且在不同程度上得到记录/支持。难以维护这种广泛的方法并确保它们在所有环境中都能正常工作。

Flask 服务器

操作系统依赖项

在执行以下步骤之前,请确保您的机器满足 操作系统依赖项。您还需要安装 MySQL。

确保您使用的是 Python 版本 3.9、3.10 或 3.11,然后继续执行

# Create a virtual environment and activate it (recommended)
python3 -m venv venv # setup a python3 virtualenv
source venv/bin/activate

# Install external dependencies
pip install -r requirements/development.txt

# Install Superset in editable (development) mode
pip install -e .

# Initialize the database
superset db upgrade

# Create an admin user in your metadata database (use `admin` as username to be able to load the examples)
superset fab create-admin

# Create default roles and permissions
superset init

# Load some data to play with.
# Note: you MUST have previously created an admin user with the username `admin` for this command to work.
superset load-examples

# Start the Flask dev web server from inside your virtualenv.
# Note that your page may not have CSS at this point.
# See instructions below on how to build the front-end assets.
superset run -p 8088 --with-threads --reload --debugger --debug

或者您可以通过我们的 Makefile 来安装它

# Create a virtual environment and activate it (recommended)
$ python3 -m venv venv # setup a python3 virtualenv
$ source venv/bin/activate

# install pip packages + pre-commit
$ make install

# Install superset pip packages and setup env only
$ make superset

# Setup pre-commit only
$ 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.pyrequirements/*.in 中定义的限制将所有依赖项更新到最新版本,请运行 pip-compile-multi`,不带任何标志

$ pip-compile-multi

这应该定期进行,但建议您对应用程序进行彻底的手动测试,以确保没有引入单元和集成测试无法捕获的重大更改。

记录到浏览器控制台

此功能仅在 Python 3 上可用。在调试应用程序时,您可以使用 ConsoleLog 包将服务器日志直接发送到浏览器控制台。您需要修改应用程序,在 config.pysuperset_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('An exception occurred!')
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: 版本 20
  • npm: 版本 10

我们建议使用 nvm 来管理您的 node 环境

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.0/install.sh | bash

in case it shows '-bash: nvm: command not found'
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion

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 中列出的第三方依赖项

# From the root of the repository
cd superset-frontend

# Install dependencies from `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
}
// ...
}

构建资产

您可以构建三种类型的资产

  1. npm run build: 生产资产,CSS/JSS 已压缩并优化
  2. npm run dev-server: 本地开发资产,具有源映射和热刷新支持
  3. 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 开发服务器

开发服务器默认在 https://127.0.0.1:9000 上启动,并将后端请求代理到 https://127.0.0.1:8088

因此,典型的开发工作流程如下

  1. 在本地运行 Superset 使用 Flask,在端口 8088 上 - 但不要直接访问它,

    # Install Superset and dependencies, plus load your virtual environment first, as detailed above.
    superset run -p 8088 --with-threads --reload --debugger --debug
  2. 同时,在端口 9000 上在本地运行 Webpack 开发服务器,

    npm run dev-server
  3. 在您的 Web 浏览器中访问 https://127.0.0.1:9000(Webpack 服务器,不是 Flask)。这将使用来自 Webpack 开发服务器的热重载前端资产,同时将后端查询重定向到 Flask/Superset:您对 Superset 代码库(前端或后端)的更改将实时反映在浏览器中。

可以更改 Webpack 服务器设置

# Start the dev server at https://127.0.0.1:9000
npm run dev-server

# Run the dev server on a non-default port
npm run dev-server -- --port=9001

# Proxy backend requests to a Flask server running on a non-default port
npm run dev-server -- --env=--supersetPort=8081

# Proxy to a remote backend but serve local assets
npm run dev-server -- --env=--superset=https://superset-dev.example.com

--superset= 选项在您要调试生产问题或必须在防火墙后面设置 Superset 时很有用。它允许您在另一个环境中运行 Flask 服务器,同时在本地构建资产,以获得最佳的开发体验。

其他 npm 命令

或者,还有其他您可能会发现有用的 NPM 命令

  1. npm run build-dev: 在开发模式下构建资产。
  2. 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 }

每个标识的可使用性状态(稳定版、测试版等)可以在 RESOURCES/FEATURE_FLAGS.md 中找到。

Git 钩子

Superset 使用 Git 预提交钩子,这些钩子由 pre-commit 提供。要安装,请运行以下命令

pip3 install -r requirements/development.txt
pre-commit install

现在,当你进行 git 提交时,将运行一系列检查。

或者,也可以通过 tox 运行 pre-commit

tox -e pre-commit

或者通过手动运行 pre-commit

pre-commit run --all-files

代码风格检查

Python

我们使用 Pylint 进行代码风格检查,可以通过以下命令调用:

# for python
tox -e pylint

在最佳实践方面,请避免全局(通过 .pylintrc)或在文件头部的顶层范围内禁用 Pylint 消息,尽管有一些例外情况。禁用应该在内联进行,因为它可以防止掩盖问题,并提供有关禁用该消息的原因的上下文。

此外,Python 代码使用 Black 自动格式化,它被配置为 pre-commit 钩子。还有许多 编辑器集成

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"
]

测试

Python 测试

所有 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 集成测试。可以 在这里找到自述文件

要运行所有集成测试,例如,从根目录运行此脚本

scripts/tests/run.sh

你可以使用 pytest 运行 './tests/unit_tests' 中的单元测试。这是一种简单的方法,可以运行不需要任何数据库设置的独立测试。

pytest ./link_to_test.py

前端测试

我们使用 JestEnzyme 来测试 TypeScript/JavaScript。测试可以通过以下命令运行:

cd superset-frontend
npm run test

要运行单个测试文件

npm run test -- path/to/file.js

集成测试

我们使用 Cypress 进行集成测试。测试可以通过 tox -e cypress 运行。要打开 Cypress 并探索测试,首先设置并运行测试服务器

export SUPERSET_CONFIG=tests.integration_tests.superset_test_config
export SUPERSET_TESTENV=true
export CYPRESS_BASE_URL="https://127.0.0.1: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

# run tests via headless Chrome browser (requires Chrome 64+)
npm run cypress-run-chrome

# run tests from a specific file
npm run cypress-run-chrome -- --spec cypress/e2e/explore/link.test.ts

# run specific file with video capture
npm run cypress-run-chrome -- --spec cypress/e2e/dashboard/index.test.js --config video=true

# to open the cypress ui
npm run cypress-debug

# to point cypress to a url other than the default (https://127.0.0.1:8088) set the environment variable before running the script
# e.g., CYPRESS_BASE_URL="https://127.0.0.1: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"]

请参阅(为容器设置功能)[https://kubernetes.ac.cn/docs/tasks/configure-pod-container/security-context/#set-capabilities-for-a-container]以了解更多详细信息。

一旦 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。

提示

添加新的数据源

  1. 为数据源创建模型和视图,将其添加到 superset 文件夹下,例如一个新的 my_models.py,其中包含集群、数据源、列和指标的模型,以及 my_views.py,其中包含 clustermodelview 和 datasourcemodelview。

  2. 为新模型创建 DB 迁移文件

  3. 在 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 文件形式的文档
  • 该插件应该有一个有意义且唯一的图标
  • 最重要的是,该插件应该得到原始作者的维护承诺

提交将根据具体情况进行考虑(提交或删除)。

添加 DB 迁移

  1. 更改要更改的模型。此示例将添加一个 Column 注释模型。

    示例提交

  2. 生成迁移文件

    superset db migrate -m 'add_metadata_column_to_annotation_model'

    这将在 migrations/version/{SHA}_this_will_be_in_the_migration_filename.py 中生成一个文件。

    示例提交

  3. 升级 DB

    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
  4. 将列添加到视图

    由于添加了一个新列,因此需要将其添加到 AppBuilder 模型视图中。

    示例提交

  5. 测试迁移的 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

合并 DB 迁移

当两个 DB 迁移发生冲突时,你会收到类似这样的错误消息

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`

要修复它

  1. 获取迁移头

    superset db heads

    这将列出两个或多个迁移哈希值。例如

    1412ec1e5a7b (head)
    67da9ef1ef9c (head)
  2. 选择其中一个作为父修订版,打开另一个修订版的脚本,并将 Revisesdown_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}
  3. 将 DB 升级到新的检查点

    superset db upgrade