MySQLのテーブルから、一部のカラムだけPlantUMLにするSQLを作成してみた。
Posted on
はじめに
MySQLのテーブル構成を把握のため、PlantUMLを使って ER図 を作成する作業をしたのですが
カラムが多すぎるため、可読性がわるく一部のカラムは省略する形で対応しました。
再度の作業に備えて、今回は一部のカラム(インデックス関連のカラム)に絞ってPlantUMLのフォーマットで出力してくれるSQLを作成しました。
作成したSQL
こちらが作成したSQLです。
SET @SCHEMA_NAME = 'world'; # スキーマ world を指定する。
SELECT
## 各要素をconcatしてつなげる
concat(ifnull(c1,''),ifnull(c2,''),ifnull(c3,''),ifnull(c4,''),ifnull(c5,''),ifnull(c6,''))
FROM (
## 各要素をplantumlの項目に整形
SELECT
CONCAT('entity ',a.TABLE_NAME,'{') c1
,CONCAT('\r\t* ',REPLACE(a.PRI,',','\r\t* ')) c2
,'\r\t---' c3
,CONCAT('\r\t# ',REPLACE(a.UNI,',','\r\t# ')) c4
,CONCAT('\r\t# ',REPLACE(a.MUL,',','\r\t# ')) c5
,'\r}' c6
FROM
(
## インデックスに紐づく絡むのみ抽出する。
## PRI: プライマリーキーに紐づくカラム
## UNI: UNIQUE インデックスの最初のカラム
## MUL: 一意でないインデックスの最初のカラム
## https://dev.mysql.com/doc/refman/8.0/ja/information-schema-columns-table.html
SELECT
TABLE_NAME
,(SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = IC.TABLE_NAME AND COLUMN_KEY = 'PRI') AS PRI
,(SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = IC.TABLE_NAME AND COLUMN_KEY = 'UNI') AS UNI
,(SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = IC.TABLE_NAME AND COLUMN_KEY = 'MUL') AS MUL
FROM INFORMATION_SCHEMA.COLUMNS IC
WHERE TABLE_SCHEMA = @SCHEMA_NAME
GROUP BY TABLE_NAME
) a
)b;
SQLを試してみる
このページで使用するMySQLのデータは MySQLの公式サンプルデータベース world を使用しています。
worldのSQLは こちら からダウンロードしてください。
1).worldに対してSQLの実行する。
MySQL Workbench で SQLを実行すると以下のような結果になります。
worldはテーブルが3個存在しますので、3行結果として帰ってきます。
2).PlantUMLを図に変換する。
SQLの結果のPlantUMLをPlantUML Web Serverを図にしました。
結果は下記のように、3つのEntityが生成されます。
まとめ
今回はテーブルと一部のカラムをPlantUMLのEntityとして出力できるSQLを作成しました。
このSQLは、外部キーによる関係性は抜き出せませんが、とりあえずどんなテーブルがあってキーはなにについているのは サクッと確認できるので個人的には満足しています。
もし関係性を抜き出したい場合はいろいろとツールがありますのでしらべてみてください。 (一例として くりにっきさまのブログ をリンクしておきます。)