もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

tbls試してみた

はじめに

こんばんは。

以前の記事で紹介した crondocに引き続き、 tableのドキュメント自動生成ツールとかないかなと思っていたところ教えてもらった、tblsというツールを試してみました。

github.com

やってみた

今回の試すにあたってvagrant上にテストDBとテストテーブル群を用意しました。

CREATE TABLE `master_categories` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PrimaryKey',
  `name` varchar(256) NOT NULL DEFAULT '' COMMENT 'カテゴリ名',
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登録日',
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日',
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'カテゴリ管理テーブル';

CREATE TABLE `master_items` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PrimaryKey',
  `category_id` int(11) unsigned NOT NULL COMMENT 'カテゴリID',
  `name` varchar(256) NOT NULL DEFAULT '' COMMENT 'アイテム名',
  `price` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '価格',
  `delivery_cost` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '配送料',
  `stock` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '在庫',
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登録日',
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日',
  PRIMARY KEY (`id`),
  KEY `userId` (`name`),
  CONSTRAINT `master_items_fk_1` FOREIGN KEY (`category_id`) REFERENCES `master_categories` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'アイテム管理テーブル';

CREATE TABLE `master_tags` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PrimaryKey',
  `name` varchar(255) NOT NULL COMMENT 'タグ名',
  `short_name` varchar(64) NOT NULL COMMENT 'ふりがな',
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登録日',
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'タグ管理テーブル';

CREATE TABLE `master_tag_relations` (
  `tag_id` int(11) unsigned NOT NULL COMMENT 'タグID',
  `item_id` int(11) unsigned NOT NULL COMMENT 'アイテムID',
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登録日',
  PRIMARY KEY (`tag_id`,`item_id`),
  CONSTRAINT `master_tag_relations_fk_1` FOREIGN KEY (`tag_id`) REFERENCES `master_tags` (`id`) ON DELETE CASCADE,
  CONSTRAINT `master_tag_relations_fk_2` FOREIGN KEY (`item_id`) REFERENCES `master_items` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'タグ中間テーブル';

では早速試します。

1. インストール

$ go get github.com/k1LoW/tbls

2. .tbls.yml 作成

$ cat .tbls.yml 
dsn: mysql://local_user:1qazxcvb@192.168.33.10:3306/tbls_test_db
docPath: schema

3. 実行

$ tbls doc
schema/schema.png
schema/master_categories.png
schema/master_items.png
schema/master_tag_relations.png
schema/master_tags.png
schema/README.md
schema/master_categories.md
schema/master_items.md
schema/master_tag_relations.md
schema/master_tags.md

docPathに指定したフォルダにmarkdownファイルとpngファイルが作成されます。

f:id:kojirooooocks:20190714225120p:plain

README.mdを開くとこんな感じ

f:id:kojirooooocks:20190714225159p:plain

めちゃめちゃいい感じです。

pngはリレーション状態を表示してくれるようです。

READMEは全体情報で、各テーブルごとの個別の情報もあります。

たとえば master_items はこちら

f:id:kojirooooocks:20190714225226p:plain

f:id:kojirooooocks:20190714225251p:plain

うん。みやすい。

終わりに

テーブルのスキーマ自体に情報がない場合(リレーションしてないとかコメントないとか)は使いづらいですが、これを使いたいという前提でスキーマの強化をしていくというアプローチもありかと思いました。

そういえば昔師匠が言ってたなぁ。

データベースの各テーブルのスキーマを見れば、サイト全体が把握できるようにするべきって。

現場からは以上です。