結論
這套工具可以掃描資料庫來產資料庫文件,But前提是你的DB 表欄位的關聯要做好,其次他產出後的文件並沒有BI需要後續整理,但是以第一步來說,沒問題
範例
https://www.globalqss.com/idempiere/11_20231224/schemaspy
必要的東西
Java
graphviz ( 可改用 vizjs )
JDBC db driver
schemaspy tool
運作
使用 Graphviz
“` bash=
java -jar schemaspy-6.2.4.jar -t pgsql11 -dp postgresql-42.7.6.jar -db idempiere -host localhost -port 5432 -u adempiere -p adempiere -s adempiere -noimplied -o D://output
使用 vizjs
``` bash=
java -Xss16m -Xmx4g -jar schemaspy-6.2.4.jar -t pgsql11 -dp postgresql-42.7.6.jar -db idempiere -host localhost -port 5432 -u adempiere -p adempiere -s adempiere -vizjs -noimplied -norows -o /db-schema2
使用 vizjs好處是他是JS,所以網站運作起來很快,缺點是製作時間長久,有些巨型圖會跑到炸掉(64MB)要避開,如果用graphviz產的時候不會炸,但是使用的時候load會比較久,整體檔案存在也比較大
參數資料
| 參數 | 說明 |
|---|---|
| -jar | 指定 SchemaSpy 主程式 JAR |
| -t | pgsql 指定資料庫類型 PostgreSQL |
| -dp | 指定 JDBC driver 路徑 |
| -db | 資料庫名稱 |
| -host | 資料庫主機 IP |
| -port | 資料庫 port(PostgreSQL 預設 5432) |
| -u / -p | 登入帳密 |
| -s | schema 名稱(通常是 adempiere) |
| -noimplied | 不顯示隱含關聯 |
| -o | 輸出資料夾 |
| -degree | 設定1 可以大幅降低畫圖產出 可省空間時間 預設2 |
全參數
https://deepwiki.com/schemaspy/schemaspy/6.1-command-line-interface
“` bash=
java -jar schemaspy-6.2.4.jar -h
-Xss16m -Xmx4g 因記憶體需求龐大而加入
## 兩者比較
| 項目 | Viz.js | Graphviz (dot) |
|---------------------|------------------------------------------------------------------------|---------------------------------------------------------------------------|
| 📦 網站產出大小 | 約 1.1 GB | 約 14 GB |
| ⚡ 載入速度 | 非常快(原生 JavaScript 渲染) | 較慢,需載入大型圖片與連結 |
| 🧱 圖形格式 | JavaScript 渲染動態圖 | 預先產生的 PNG + image map |
| 🧰 系統需求 | 無需安裝額外工具 | 需安裝 `graphviz` (`apt install graphviz`) |
| ⏳ 產出速度 | 較慢,為 Graphviz 的 2 倍以上 | 較快(但仍需數小時) |
| 💥 限制 | dot 檔大於 64MB 會失敗(WebAssembly 限制) | 幾乎無限制,穩定產出 |
| 📛 常見錯誤訊息 | `Cannot enlarge memory arrays` | 少見錯誤 |
## GUI
https://sourceforge.net/projects/schemaspygui/files/latest/download


## 自動化腳本
``` sql=
-- DB要把所有的 comment進行處理
DO $$
DECLARE
rec RECORD;
cmd varchar;
BEGIN
FOR rec IN
SELECT t.TableName,
CASE WHEN t.IsView=\'Y\' THEN \'VIEW\' ELSE \'TABLE\' END AS ObjectType,
COALESCE(t.Description,t.Name) AS Description
FROM AD_Table t
WHERE t.IsActive=\'Y\'
ORDER BY 1
LOOP
cmd := \'COMMENT ON \' || rec.ObjectType || \' \' || rec.TableName || \' IS \'\'\' ||
REPLACE(rec.Description,\'\'\'\', \'\'\'\'\'\') || \'\'\'\';
RAISE NOTICE \'%\', cmd;
EXECUTE cmd;
END LOOP;
FOR rec IN
SELECT t.TableName,
c.ColumnName,
COALESCE(c.Description,c.Name) AS Description
FROM AD_Table t JOIN AD_Column c ON (c.AD_Table_ID=t.AD_Table_ID)
WHERE t.IsActive=\'Y\' AND c.IsActive=\'Y\' AND c.ColumnSQL IS NULL
ORDER BY 1,2
LOOP
cmd := \'COMMENT ON COLUMN \'|| rec.TableName || \'.\' || rec.ColumnName || \' IS \'\'\' ||
REPLACE(rec.Description,\'\'\'\', \'\'\'\'\'\') || \'\'\'\';
RAISE NOTICE \'%\', cmd;
EXECUTE cmd;
END LOOP;
END $$;
“` bash=
psql -U adempiere -d idempiere -f comment_sync.sql
``` bash=
# 產出 DB DOC 網站
java -Xss16m -Xmx4g -jar /Users/tom/tools/schemaspy-6.2.4.jar -t pgsql11 -dp /Users/tom/tools/postgresql-42.7.6.jar -db idempiere -host localhost -port 5432 -u adempiere -p adempiere -s adempiere -vizjs -noimplied -degree 1 -norows -o /Users/tom/workspace/db-schema3
# 上傳到正式環境
sudo scp -r /Users/tom/workspace/db-schema3/* [email protected]:/home/tom/doc/dbschema/
# 把網站轉移到正式區的work區域
sudo cp -r /home/tom/doc/dbschema/* /etc/idempiere-server/x86_64/dbschema/
“` bash=
!/bin/bash
set -e
=== [1] 設定參數 ===
DB_HOST=”192.168.1.61″
DB_PORT=”5432″
DB_NAME=”idempiere”
DB_USER=”adempiere”
DB_PASS=”adempiere” # 若已設定在 ~/.pgpass 可省略 -p
SCHEMASPY_JAR=”/Users/tom/tools/schemaspy-6.2.4.jar”
POSTGRESQL_DRIVER=”/Users/tom/tools/postgresql-42.7.6.jar”
SCHEMA=”adempiere”
OUTPUT_DIR=”/Users/tom/workspace/db-schema3″
REMOTE_USER=”tom”
REMOTE_HOST=”192.168.1.63″
REMOTE_DIR=”/home/tom/doc/dbschema/”
PROD_DIR=”/etc/idempiere-server/x86_64/dbschema”
COMMENT_SQL=”/Users/tom/tools/comment_sync.sql” # 調整成實際路徑 內容為上面的同步SQL
=== [2] 執行 COMMENT 同步 ===
echo “==> Syncing COMMENT from AD metadata…”
PGPASSWORD=$DB_PASS psql -h “$DB_HOST” -U “$DB_USER” -d “$DB_NAME” -f “$COMMENT_SQL”
=== [3] 產出 ER 文件 ===
echo “==> Generating ER documentation with SchemaSpy…”
java -Xss16m -Xmx4g -jar “$SCHEMASPY_JAR” \
-t pgsql11 \
-dp “$POSTGRESQL_DRIVER” \
-db “$DB_NAME” \
-host “$DB_HOST” \
-port “$DB_PORT” \
-u “$DB_USER” \
-p “$DB_PASS” \
-s “$SCHEMA” \
-vizjs \
-noimplied \
-degree 1 \
-norows \
-o “$OUTPUT_DIR”
=== [4] 上傳到正式環境 ===
echo “==> Uploading to $REMOTE_HOST…”
scp -r “$OUTPUT_DIR”/* “$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR”
=== [5] 複製到正式工作區 ===
echo “==> Deploying to production directory on $REMOTE_HOST…”
ssh “$REMOTE_USER@$REMOTE_HOST” “sudo cp -r $REMOTE_DIR* $PROD_DIR/”
echo “✅ All done.”
“`
參考資料
https://github.com/schemaspy/schemaspy/releases/tag/v6.2.4
https://jdbc.postgresql.org/download
https://deepwiki.com/schemaspy/schemaspy
https://graphviz.org/download/
https://sourceforge.net/projects/schemaspygui/files/latest/download
發佈留言