schemaSpy

結論

這套工具可以掃描資料庫來產資料庫文件,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

![圖片](https://hackmd.io/_uploads/BkWmWXr7xg.png)
![圖片](https://hackmd.io/_uploads/B1LQWmSXxx.png)

## 自動化腳本
``` 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

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *