6
7

schemaspyでER図を生成

Last updated at Posted at 2024-07-27

はじめに

テーブル定義とかER図とかを資料にするのが面倒で、何かいいのないかと調べたところschemaspyを見つけました。
これでいい感じにDB仕様書がつくってみます。

自分でDBやテーブル定義を用意するのが面倒だったのでisuconの勉強も兼ねてprivate-isuをお借りしました。

private-isuを立ち上げる

前準備としてprivate-isuを立ち上げます。
立て方と後片付けのやり方は

を参考にしてください。

また、上記に加えてschemaspyでmysqlへのアクセスを行うため、インバウンドルールを追加で設定する必要があります。

MYSQL/Auroraをインバウンドルールに追加しましょう

下記記事が参考になります。

躓きポイントなのでしっかりやっておきましょう。
私はインバウンドルールが認識の外にあったので躓きました。

インスタンスとmysqlに入る

SSH接続かなんかで上記で立てたインスタンスに入ります。

chmod 400 /path/to/my-key-pair.pem
ssh -i /path/to/my-key-pair.pem ubuntu@ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com

権限考えるの面倒なんでroot権限で入ります。普通に良くないのでやめた方がいいです。

sudo su -

mysqlもrootユーザで入ります。
入るのに必要な情報はこのへんを見ます。

mysql -u isuconp -p

ポートとホストを確認。

-- host
show variables like 'hostname';
-- port
show variables like 'port';

DBを確認。

show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| isuconp            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set

isuconp (今回schemaspyでER図を作るDB) も一応確認。

show tables from isuconp;

+-------------------+
| Tables_in_isuconp |
+-------------------+
| comments          |
| posts             |
| users             |
+-------------------+
3 rows in set

良さげではないでしょうか。

ユーザーの作成とアクセス権限の付与

MySQL Serverに外部から接続するために、外部接続用ユーザの作成と権限付与を行います。
下記のようにクエリを叩くと、権限がlocalhostしかないことがわかります。
これでは外部からのアクセスができません!

select user, host from mysql.user;

+------------------+-----------+
| user             | host      |
+------------------+-----------+
| isuconp          | localhost |
| root             | localhost |
| ...etc           | localhost |
+------------------+-----------+
x rows in set

なので作ります。

create user "schemaspy"@"%" identified by "%password%";

select user, host from mysql.user;

+------------------+-----------+
| user             | host      |
+------------------+-----------+
| schemaspy        | %         |
| isuconp          | localhost |
| root             | localhost |
| ...etc           | localhost |
+------------------+-----------+
x rows in set

権限の付与もするぞ!

grant all privileges on *.* to "schemaspy"@"%";

できたらmysqlの外に出て、mysqld.cnfを編集します。
下記2項目をIPフリーにします。SG側で設定しているから大丈夫でしょ(適当)

bind-address		= 0.0.0.0
mysqlx-bind-address	= 0.0.0.0

リスタートします。

sudo service mysql restart

この章は下記記事を参考にしました。

schemaspy

schemaspyを動かします。
ここからは上記と異なり、EC2インスタンス状ではなく、手元で動かします。
下記記事を参考にしてschemaspy/schemaspyから最新のものをzipで落としてきます。

私はdockerで動かしたので下記のコマンドを叩きました。

docker run -v "$PWD/schema:/output" --net="host" schemaspy/schemaspy:snapshot \
 -t mysql -host %EC2インスタンスのパブリックIP%:3306 -db isuconp -u schemaspy -p %password% -connprops useSSL\\=false -s isuconp

上記を叩いて

Public Key Retrieval is not allowed schemaspy

と出るようなら、 connpropsallowPublicKeyRetrieval\\=false を加えます。(もしかしたらtrueかも)

すると path/to/schemaspy-x.y.z/schema に色々出来上がるので、その中のindex.htmlを見てみます。

open ./schemaspy-x.y.z/schema/index.html

やったぜ!

スクリーンショット 2024-07-27 17.50.43.png

初期状態では下記の通りリレーションがないので、ER図もへったくれもありません。

DESC isuconp.posts;
+------------+-------------+------+-----+-------------------+-------------------+
| Field      | Type        | Null | Key | Default           | Extra             |
+------------+-------------+------+-----+-------------------+-------------------+
| id         | int         | NO   | PRI | NULL              | auto_increment    |
| user_id    | int         | NO   |     | NULL              |                   |
| mime       | varchar(64) | NO   |     | NULL              |                   |
| imgdata    | mediumblob  | NO   |     | NULL              |                   |
| body       | text        | NO   |     | NULL              |                   |
| created_at | timestamp   | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+-------------+------+-----+-------------------+-------------------+

リレーションを追加してみましょう。

リレーションを追加する

再びEC2インスタンスに戻ります。

alter tableに時間がかかるので、ここではpostsにだけ外部キーを貼ります。

use isuconp;
ALTER TABLE posts ADD FOREIGN KEY (user_id) REFERENCES users (id);
DESC posts;

+------------+-------------+------+-----+-------------------+-------------------+
| Field      | Type        | Null | Key | Default           | Extra             |
+------------+-------------+------+-----+-------------------+-------------------+
| id         | int         | NO   | PRI | NULL              | auto_increment    |
| user_id    | int         | NO   | MUL | NULL              |                   |
| mime       | varchar(64) | NO   |     | NULL              |                   |
| imgdata    | mediumblob  | NO   |     | NULL              |                   |
| body       | text        | NO   |     | NULL              |                   |
| created_at | timestamp   | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+-------------+------+-----+-------------------+-------------------+

再びschemaspy

手元に戻って再びschemaspyを動かします。

docker run -v "$PWD/schema:/output" --net="host" schemaspy/schemaspy:snapshot \
 -t mysql -host %EC2インスタンスのパブリックIP%:3306 -db isuconp -u schemaspy -p %password% -connprops allowPublicKeyRetrieval\\=false useSSL\\=false -s isuconp

index.htmlをみます。

open ./schemaspy-x.y.z/schema/index.html

user_idに外部キーが載ってる!

スクリーンショット 2024-07-27 19.26.48.png

Foooooooo!! 勝ち!!

スクリーンショット 2024-07-27 19.27.29.png

おわりに

schemaspyでDB仕様書をいい感じに生成できました!
あとはschem配下をgh-pagesかなにかに公開すればみんなで確認できます。私はgh-pagesを使ってデプロイしました。
そしてAWSリソースはお金がどんどん飛んでいくのでちゃんと後片付けをしましょう。
読んでいただきありがとうございました。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7