あれ、もしかしてNO_TABLE_OPTIONSってMySQLから消えてる…? tbls でどうすればいいんだ…。
— hamaco (@hamaco) 2020年6月11日
上記のツイートで知りました。
NO_TABLE_OPTIONSが削除されたVerのリリースノートは以下です。
NO_TABLE_OPTIONSとは
SHOW CREATE TABLE の出力で MySQL 固有のテーブルオプション (ENGINE など) を出力しません。このモードはポータビリティモードで mysqldump によって使用されます。 ( MySQL 5.6 リファレンスより )
SHOW CREATE TABLE
はテーブル定義をDDLで出力するコマンドです。例えば SHOW CREATE TABLE
により以下のようなDDLが出力されたとします。
CREATE TABLE `users` ( `id` int NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(50) NOT NULL, `email` varchar(355) NOT NULL COMMENT 'ex. user@example.com', `created` timestamp NOT NULL, `updated` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`), UNIQUE KEY `email` (`email`) ) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Users table'
NO_TABLE_OPTIONSの説明にある MySQL 固有のテーブルオプション
というのは上記DDLの ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Users table'
の部分だと認識しています(間違っていたらごめんなさい)。
この中で AUTO_INCREMENT=100
というオプションはAUTO INCREMENTのスタートを指定するものなのですが、この 100
という値はテーブルにレコードが追加されていく度に動的に変化する(インクリメントされていく)値になります。
上記の挙動の何が困るのかというと「動的に変化する」というところで、実テーブルのスキーマとドキュメントの差分によってCIを回したりするtblsでは「運用しているテーブルだと毎回差分が発生してしまう」という現象が発生してしまいます。
そして、その回避策として NO_TABLE_OPTIONS
の利用を推奨していました。
MySQLならDSNに ?sql_mode=NO_TABLE_OPTIONS を加えてくださいー(SQLモードが関係しています)
— k1LoW (@k1LoW) 2019年11月25日
そしてその回避策もとれない状況になったわけです。
NO_TABLE_OPTIONSがなくなった今、tblsの対応
結局tbls v1.39.0からデフォルトでTable Definitionに出力されるDDLのAUTO_INCREMENTの値だけを消すことにしました。
具体的にはv1.39.0から以下のように出力されます。
CREATE TABLE `users` ( `id` int NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(50) NOT NULL, `email` varchar(355) NOT NULL COMMENT 'ex. user@example.com', `created` timestamp NOT NULL, `updated` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`), UNIQUE KEY `email` (`email`) ) ENGINE=InnoDB AUTO_INCREMENT=[Redacted by tbls] DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Users table'
もしAUTO_INCREMENTの値もそのまま表示したいときは、DSNのクエリストリングに ?show_auto_increment=1
を追加してください。
「デフォルトで消す」設定にした理由は「tblsがCIで利用するためのツールである」という点に重きを置いたからです。
というわけで
複数のRDBMSやNoSQLの仕様を強引に1つの型に押し込めているのがtblsで、そのメリットがあると踏んでいるからそうしているのだけど、まあいろいろ設計に困ることはあるよね。
— k1LoW (@k1LoW) 2020年6月11日
ORMっぽい。
今後ともよろしくお願いします。