跳至主要內容
在 GitHub 上編輯此頁面

設定開發環境

本節的文件有點像是知識的大雜燴,代表著執行 Superset 的多種方式(docker compose、僅使用 "docker"、在 "實體機" 上、使用 Makefile)。

注意

現在我們已發展到更積極地推薦和支援 docker compose 作為執行 Superset 的主要開發方式,並保持你的理智。**大多數人應該堅持前幾個章節 - (「Fork & Clone」、「docker compose」和「安裝開發工具」)**

Fork 和 Clone

首先,在 GitHub 上 fork 儲存庫,然後 clone 它。

其次,你可以直接 clone 主要儲存庫,但你將無法發送 pull request。

git clone git@github.com:your-username/superset.git
cd superset

在 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 登入
注意

superset-node 內為 Apache Superset 安裝和建置 Node 模組可能需要相當長的時間。由於相依性的規模,這是正常的。請耐心等待該過程完成,長時間的等待並不表示你的設定有問題。如果延遲時間似乎過長,請檢查你的網際網路連線或系統資源。

注意

由於 docker compose 主要設計用於在**單一主機**上執行一組容器,因此無法可靠地支援**高可用性**,因此我們不支援也不建議使用我們的 docker compose 結構來支援生產型使用案例。對於單一主機環境,我們建議使用 minikube 和我們的 在 k8s 上安裝 文件。設定為安全。

安裝開發工具

注意

雖然 docker compose 簡化了許多設定,但你仍然需要在本機設定許多東西,以便為你的 IDE 和諸如**提交鉤子**、**linter** 和**測試執行器**等工具提供支援。請注意,你可以在 docker 映像檔中使用諸如 docker compose exec superset_app bash 之類的命令執行這些操作,但許多人喜歡從其主機執行該工具。

Python 環境

假設你已經有諸如 pyenvvirtualenv 或其他方式來設定你的 python 環境,你所要做的就是安裝我們的開發、固定的 python 要求套件

pip install -r requirements/development.txt

Git 鉤子

Superset 使用 pre-commit 提供的 Git pre-commit 鉤子。要安裝,請執行以下命令

pre-commit install

這將在你的本機儲存庫中安裝鉤子。從現在開始,每當你進行 Git 提交時,都會自動執行一系列檢查。

手動執行 Pre-commit

你也可以透過各種方式手動執行 pre-commit 檢查

  • 對所有檔案執行 pre-commit(與 CI 相同)

    若要對儲存庫中的所有檔案執行 pre-commit 檢查,請使用以下命令

    pre-commit run --all-files

    這與 CI 期間將執行的檢查組相同,確保你的變更符合專案的標準。

  • 對特定檔案執行 pre-commit

    如果你要檢查或修正特定檔案,可以透過指定檔案路徑來執行

    pre-commit run --files path/to/your/file.py

    這只會對你指定的檔案執行檢查。

  • 執行特定的 pre-commit 檢查

    若要跨所有檔案或特定檔案執行特定檢查 (hook),請使用以下命令

    pre-commit run <hook_id> --all-files

    或是針對特定檔案

    pre-commit run <hook_id> --files path/to/your/file.py

    <hook_id> 替換為你要執行的特定 hook 的 ID。你可以在 .pre-commit-config.yaml 檔案中找到可用的 hook 清單。

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 env 變數應該不需要設定,因為它目前透過 .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)

然後請確保你使用正確的工作者類型執行 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 和影像),才能正確顯示網頁 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 shell zsh 開始的預設 macOS,請嘗試

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 監視器的數量來解決此錯誤。

可以使用以下指令檢查目前的最大監視值:

cat /proc/sys/fs/inotify/max_user_watches

編輯檔案 /etc/sysctl.conf 以增加此值。此值需要根據系統記憶體來決定 (請參閱此 StackOverflow 回答以瞭解更多資訊)

在編輯器中開啟檔案,並在底部新增一行,指定最大監視值。

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. 8088 埠使用 Flask 本機執行 Superset — 但不要直接存取它。

    # 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,確保根據 npm 規定的最佳做法更新 superset-frontend/package-lock.json

功能旗標

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 鉤子

Superset 使用 pre-commit 提供的 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

就最佳做法而言,請避免全面性地停用全域的 Pylint 訊息(透過 .pylintrc)或檔案標頭內的最上層訊息,儘管有一些例外情況。停用應該內嵌發生,因為這樣可以防止遮蓋問題,並提供停用該訊息的原因。

此外,Python 程式碼會使用 Black 自動格式化,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(一個標準化的測試框架)中進行。可以使用任何 tox 環境,透過以下方式執行所有 Python 測試:

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

前端測試

我們使用 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.dev.org.tw/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

當您將新的 React 元件貢獻給 Superset 時,請嘗試在元件的 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 Annotations 模型。

    範例提交

  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