使用 SchemaCrawler 將 ERD 做最簡化的線圖

當資料庫 Table 太多,相關的 PK、FK 就會很多,畫出 ERD 的線圖自然會複雜到看不懂

想要盡量把 ERD 的線拉直,盡量不要看起來飛來飛去的,可以靠 SchemaCrawler 來直接生成

使用 SchemaCrawler 將 ERD 做最簡化的線圖

SchemaCrawler 可以將目前的資料庫,依照 PK、FK 等,自動產生 ERD,中間 1:1、1:n 的線也會是最簡化的版本

系統套件需求:

  • schemacrawler 需要 Java,畫圖需要 Graphviz,所以需要安裝:
    • apt install graphviz openjdk-19-jre

若要從現有的資料庫來畫出 ERD,可用下述:

  • ./schemacrawler.sh --server=mysql --host localhost --port 3306 --user root --password=root_pass --database example_db --info-level standard --command schema --output-file /tmp/erd.pdf

若想要將資料庫欄位名稱、註解都用表格列出,不是要畫成 ERD,可以直接存 HTML 即可 (想要上面 ERD 圖,下面表格可以存 .htmlx)

  • ./schemacrawler.sh --server=mysql --host localhost --port 3306 --user root --password=root_pass --database example_db --info-level standard --command schema --output-file /tmp/erd.html

只要把 PK、FK 那些關係拉出來,可以使用 --command brief 畫圖

  • ./schemacrawler.sh --server=mysql --host localhost --port 3306 --user root --password=root_pass --database example_db --info-level standard --command beief --output-file /tmp/erd.html

若要直接從 SQL 檔來產生 ERD,就需要先弄個 MySQL 把 SQL 檔 import 進去,再來畫出來的作法如下。

SchemaCrawler 需要從 DB 直接 Dump Schema 來畫圖,下述範例使用 MySQL 為範例:

  1. sudo docker run --name docker_mysql --rm -e MYSQL_ROOT_PASSWORD=root_pass -p 3306:3306 -d percona/percona-server:8.0
  2. docker inspect --format '{{ .NetworkSettings.IPAddress }}' docker_mysql # 假設取得ip:172.17.0.2
  3. mysql -u root -proot_pass -h 172.17.0.2 -P3306 -e "CREATE DATABASE example_db" # 建立資料庫
  4. mysql -u root -proot_pass -h 172.17.0.2 -P3306 example_db < db-schema.sql # 匯入 Schema,記得要有 PK、FK
  5. wget https://github.com/schemacrawler/SchemaCrawler/releases/download/v16.19.10/schemacrawler-16.19.10-bin.zip # 下載 schemacrawler
  6. unzip schemacrawler-16.19.10-bin.zip # 假設放在 /tmp/schemacrawler-16.19.10-bin/
  7. cd /tmp/schemacrawler-16.19.10-bin/
  8. ./schemacrawler.sh --server=mysql --host 172.17.0.2 --port 3306 --user root --password=root_pass --database example_db --info-level standard --command schema --output-file /tmp/erd.pdf # /tmp/erd.pdf 就是乾淨清楚的 ERD
  9. 註: --output-file 可以直接寫 erd.png 生出圖檔,但是同樣 schema(PDF 148k、PNG 1.8M),開啟瀏覽時,PNG 圖片太大會很卡,PDF 會比較順暢

將上述寫成 Shell script:(需要設定 SCHEMACRAWLER_BIN、SCHEMACRAWLER_OUTPUT、DB_SCHEMA_SQL 這三個參數)

  1. vim schemacrawler-gen-erd.sh
    #!/bin/bash
    
    SCHEMACRAWLER_BIN=/tmp/schemacrawler-16.19.10-bin/bin # SCHEMACRAWLER bin 的路徑
    SCHEMACRAWLER_OUTPUT=/tmp/erd.pdf # ERD 圖檔產生要放在哪裡
    DB_SCHEMA_SQL=/tmp/db_schema.sql # 要載入的 SQL 檔案路徑
    DB_PASSWORD=root_pass
    DB_NAME=example_db
    DOCKER_DB_PORT=33065 # 避免自己機器 3306 port 撞到,暫時啟動的可以開不同 Port
    
    sudo docker run --name docker_mysql --rm -e MYSQL_ROOT_PASSWORD=$DB_PASSWORD -p $DOCKER_DB_PORT:3306 -d percona/percona-server:8.0
    DOCKER_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' docker_mysql)
    while ! mysqladmin ping -h"$DOCKER_IP" --silent; do
        sleep 1
    done
    docker exec -i docker_mysql /usr/bin/mysql -u root -p$DB_PASSWORD --default-character-set=utf8mb4 -e "CREATE DATABASE $DB_NAME"                                                               
    docker exec -i docker_mysql /usr/bin/mysql -u root -p$DB_PASSWORD --default-character-set=utf8mb4 $DB_NAME -e "SET NAMES utf8mb4;" < $DB_SCHEMA_SQL
    $SCHEMACRAWLER_BIN/schemacrawler.sh --server=mysql --host "$DOCKER_IP" --port 3306 --user root --password=$DB_PASSWORD --database $DB_NAME --info-level standard --command schema --output-file $SCHEMACRAWLER_OUTPUT
    
  2. chmod +x schemacrawler-gen-erd.sh
  3. ./schemacrawler-gen-erd.sh # 就會產生 /tmp/erd.pdf

SchemaCrawler 更多參數設定

  1. 有更多的設定參數,可以:wget https://www.schemacrawler.com/config/schemacrawler.config.properties
  2. 然後於命令加入 --config-file=schemacrawler.config.properties 即可
  3. 範例:./schemacrawler.sh --server=mysql --host localhost --port 3306 --user root --password=root_pass --database example_db --info-level standard --command schema --config-file=schemacrawler.config.properties --output-file $SCHEMACRAWLER_OUTPUT

更多範例與參數:SchemaCrawler - Free database schema discovery and comprehension tool

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料