Posted at

markdownからDDLを作成するmarkdownsql

More than 1 year has passed since last update.

プロジェクト開始時、テーブルを設計する時にどんなツールを使ってますか?

Excel/Spreadsheet・・・カラム追加したいとき、いちいち行の追加をしないといけない。SQLに変換でけへん。レガシー感が嫌だ。

MySQLWorkBench・・・気が重い。そんな大きなプロジェクトじゃないので、もっとカジュアルに設計したい。

もっとこう、いい感じの欲しい。

やっぱりエンジニアは、markdownが大好きだと思います。

そこで、markdownで書いたテーブル定義から、MySQLで使えるDDL(Createテーブル)を生成するツールを作りました。


markdownsql

https://github.com/narita-takeru/markdownsql


インストール

go get -u github.com/narita-takeru/markdownsql/cmd/markdownsql


使い方

markdownsql (****.md)

リポジトリに、サンプル(test.md)を置いてます。

それをSQLに変換すると

DROP TABLE IF EXISTS `users`;

CREATE TABLE `users` (
`id` bigint NOT NULL primary key comment 'user identifier',
`name` varchar(255) NOT NULL comment 'user name',
`created_at` datetime NOT NULL DEFAULT current_timestamp comment 'record created.',
`updated_at` datetime NOT NULL DEFAULT current_timestamp on update current_timestamp comment 'record updated.',
INDEX(`name`)
) ENGINE = InnoDB DEFAULT CHARSET utf8;

DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
`id` bigint NOT NULL primary key comment 'product identifier',
`category` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`price` integer NOT NULL DEFAULT 0,
`created_at` datetime NOT NULL DEFAULT current_timestamp comment 'record created.',
`updated_at` datetime NOT NULL DEFAULT current_timestamp on update current_timestamp comment 'record updated.',
UNIQUE(`category`,`name`)
) ENGINE = InnoDB DEFAULT CHARSET utf8;

こんな感じで、DDLを作成します。


markdown定義の仕様



  • #で始まる行は、データベース名を書きます。※今のところ、特にSQLには影響しません。


  • ##で始まる行は、テーブル名を書きます。


  • ### columnsの行の下には、カラムの内容を表形式で書いていきます。

|name|type|comment|

|----|----|----|----
|id|int|識別子|



  • ### indexesの行の下には、インデックスの内容を表形式で書いていきます。

|columns|unique|

|---|---|
|name|YES|

複数カラムのインッデクスを貼る場合は、columnsに、カンマ区切りでカラム名を並べます。


実装内容

XMLのパース方法であるSAX(Simple API for XML)をリスペクトし、SAM(Simple API for MarkDown)方式で、イベントドリブンでmarkdownをパースしてってます。

※XMLが流行っていた時代、DOMよりSAXの方が何となくカッコよくて好きだったおじさんです