當資料庫 Table 太多,相關的 PK、FK 就會很多,畫出 ERD 的線圖自然會複雜到看不懂
想要盡量把 ERD 的線拉直,盡量不要看起來飛來飛去的,可以靠 SchemaCrawler 來直接生成
使用 SchemaCrawler 將 ERD 做最簡化的線圖
SchemaCrawler 可以將目前的資料庫,依照 PK、FK 等,自動產生 ERD,中間 1:1、1:n 的線也會是最簡化的版本
- 官方網站:SchemaCrawler - Free database schema discovery and comprehension tool
- GitHub:schemacrawler (SchemaCrawler - Sualeh Fatehi) · GitHub
- 下載Release binary:Releases · schemacrawler/SchemaCrawler
系統套件需求:
- 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 為範例:
- sudo docker run --name docker_mysql --rm -e MYSQL_ROOT_PASSWORD=root_pass -p 3306:3306 -d percona/percona-server:8.0
- docker inspect --format '{{ .NetworkSettings.IPAddress }}' docker_mysql # 假設取得ip:172.17.0.2
- mysql -u root -proot_pass -h 172.17.0.2 -P3306 -e "CREATE DATABASE example_db" # 建立資料庫
- mysql -u root -proot_pass -h 172.17.0.2 -P3306 example_db < db-schema.sql # 匯入 Schema,記得要有 PK、FK
- wget https://github.com/schemacrawler/SchemaCrawler/releases/download/v16.19.10/schemacrawler-16.19.10-bin.zip # 下載 schemacrawler
- unzip schemacrawler-16.19.10-bin.zip # 假設放在 /tmp/schemacrawler-16.19.10-bin/
- cd /tmp/schemacrawler-16.19.10-bin/
- ./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
- 註: --output-file 可以直接寫 erd.png 生出圖檔,但是同樣 schema(PDF 148k、PNG 1.8M),開啟瀏覽時,PNG 圖片太大會很卡,PDF 會比較順暢
將上述寫成 Shell script:(需要設定 SCHEMACRAWLER_BIN、SCHEMACRAWLER_OUTPUT、DB_SCHEMA_SQL 這三個參數)
- 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
- chmod +x schemacrawler-gen-erd.sh
- ./schemacrawler-gen-erd.sh # 就會產生 /tmp/erd.pdf
SchemaCrawler 更多參數設定
- 有更多的設定參數,可以:wget https://www.schemacrawler.com/config/schemacrawler.config.properties
- 然後於命令加入 --config-file=schemacrawler.config.properties 即可
- 範例:./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
相關網頁
- How to Visualize Your MySql Database with One Command (and Nothing to Install)
- Document Your Database Series' Articles - (SQLite、PostgreSQL、MySQL、Cassandra.. 跟 SchemaCrawler 參數命令下法)