Webでテーブル定義からDDL出力するサービス「TableArtisan」を実装

初投稿です。

早くも30代半ばになり、開発以外の業務も多々あり、開発に関する知識の記憶容量が減ってきたのが実感してきました。
自分への備忘録として、また未来のプログラマの役に立ってくれればと思います。

記念すべき１回目は[Webでテーブル定義からDDL出力するサービス「TableArtisan」](https://tableartisan.com/ "tableartisan")を実装したので、紹介させていただきます。

https://tableartisan.com/

# [Webでテーブル定義からDDL出力するサービス「TableArtisan」](https://tableartisan.com/ "tableartisan")を実装

背景として、データベースのテーブルを設計をする際、基本的にExcel等の表計算ソフトを用いて設計する場面が多いと思います。
出来上がったドキュメントをファイルサーバや、バージョン管理にUPする運用がスタンダードですが、あるあるな難点を解消したく、[Webでテーブル定義からDDL出力するサービス](https://tableartisan.com/ "tableartisan")を実装しました。

# テーブル設計時のストレスポイント
* 作業者間のコンフリクト解消時の修正作業
* コミット履歴から何が修正されたのかがわからない
* 開発中にドキュメント類のファイルを開きまくってマシンが重くなる
* Macでの開発も増えてきて、そもそもExcel非対応
* DDL作成マクロがこの時代でも毎回作るか、手作業でSQLをかく。

# 出来る事
* 簡易的なテーブル設計（カラム、INDEXの定義）
* 作業状態をJSONで保存（ダウンロード）
* 作業状態をJSONから復帰（アップロード）
* DDLの出力

# 出来ない事
* サーバ上へ作業状態の保存
* カラム、INDEXのオプション等の詳細な定義
* ER図の作成
* 外部キーの定義
* 作者があまり使わないカラムは省いてます

# 対象のRDBMS
* [MySQL](https://tableartisan.com/mysql)
* [PostgreSQL](https://tableartisan.com/psql)

今後需要がありそうであれば、対象のDBMSも追加していこうと思います。

# 使い方
基本的に、自由度を高くしているので、入力項目に対するエラーチェック等は制限つけてません。

## 1.データベース名の入力
お好みでDataBaseを入力します。
DDL発行時に、CREATE文が出来るだけなので、そこまで重要ではないです。
![スクリーンショット 2022-03-13 2.51.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2585352/f1db2988-1731-87ff-eff7-f074ae530b1f.png)

## 2.テーブル定義

### 2-1.テーブルを追加
[add Table]を押すと、テーブルが追加されます。
![スクリーンショット 2022-03-13 2.27.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2585352/f7fc7c29-eb2c-a208-3312-a47302e6f8ee.png)

![スクリーンショット 2022-03-13 2.28.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2585352/1d97fdf1-270b-0f57-a514-66ea033e7235.png)

### 2-2.テーブルの修正
[edit]を押すと、設定用のmodalが開きます。
![スクリーンショット 2022-03-13 2.30.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2585352/c40ede48-a40a-f186-3799-69c767ca7733.png)

任意に以下を設定していきます。
* テーブル名
* カラム
* INDEX
（employeeで作成例）
![スクリーンショット 2022-03-13 2.36.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2585352/569b6b1d-5c9b-e411-d263-75bee7df63d8.png)

:::note info
捕捉
* カラムの[Defalut]は、文字列の場合は「'(シングルクォーテーション)」で囲む
* カラムの[Comment]は、捕捉の意味で、「COMMENT ON」ではありません。
* 複合INDEXを付けたい場合は、カラム名を「,(カンマ)」区切りで記述可能

:::

[Save]を押して反映させます。

![スクリーンショット 2022-03-13 2.37.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2585352/6dd47078-4eff-6511-60e3-4c8c7a1328a3.png)

同様の要領でテーブルを定義していきます。

## 3.データを保存
画面footerの「export」を押して、作成データをJsonで保存します。
![スクリーンショット 2022-03-13 2.42.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2585352/91ebb4c9-5677-f50a-c937-1e3735bb019b.png)

上記で設定したsampleの結果(MySQL)
``` json export.json
{
  "databaseName": "",
  "tables": [
    {
      "name": "employee",
      "columns": [
        {
          "name": "id",
          "type": "serial",
          "length": null,
          "notNull": true,
          "default": "",
          "comment": "主キー"
        },
        {
          "name": "no",
          "type": "varchar",
          "length": 10,
          "notNull": true,
          "default": "",
          "comment": ""
        },
        {
          "name": "name",
          "type": "varchar",
          "length": 40,
          "notNull": true,
          "default": "",
          "comment": ""
        },
        {
          "name": "birthday",
          "type": "date",
          "length": null,
          "notNull": true,
          "default": "",
          "comment": ""
        }
      ],
      "indexes": [
        {
          "name": null,
          "type": "PRIMARY",
          "column": "id"
        },
        {
          "name": null,
          "type": "UNIQUE",
          "column": "no"
        }
      ]
    }
  ]
}
```

保存したJSONファイルを[import]させて復帰が可能なので、バージョン管理で保管したり、作業者間で共有することが可能です。


## 4.DDLの作成
画面footerの「Generate DDL」を押して、DDLをダウンロードします。
![スクリーンショット 2022-03-13 2.42.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2585352/91ebb4c9-5677-f50a-c937-1e3735bb019b.png)

上記で設定したsampleの結果(MySQL)
``` sql exportDDl.sql
CREATE DATABASE IF NOT EXISTS samle;

DROP TABLE IF EXISTS `employee`;


CREATE TABLE `employee` (
    `id` serial NOT NULL,
    `no` varchar(10) NOT NULL,
    `name` varchar(40) NOT NULL,
    `birthday` date NOT NULL
);

ALTER TABLE `employee` ADD PRIMARY KEY (id);
ALTER TABLE `employee` ADD UNIQUE (no);

```

# 最後に
都度バージョンアップを検討していますが、是非活用していただければと思います。