Slick (Scala) のテーブル定義からSQLのCREATE TABLE文を標準出力するだけ (MySQLでのカラム型一覧あり)
目次:
なにがしたい
Scalaのデータベース処理のライブラリであるSlickで、Slickのテーブル定義(クラス定義)からSQLのCREATE TABLE文を標準出力したいです。 Slickのテーブル定義(クラス定義)を書いて、それからまた同じDBマイグレーションのためのSQLファイルを書くケースでは、何度も1から書くのは避けたいですよね。 あと、Slickがサポートしているカラムの型が結局DBでなにの型になるのかよくわからないので、それを一覧で確認したい次第です。
コード:
↓ データベースのテーブルスキーマからSlickのテーブル定義を生成する(今回と逆)のツールはありますが、設定とかややこしそうで手を出しづらいです😅
Schema Code Generation — Slick 3.2.0 documentation
コードを書く時点ですでにデータベース上にスキーマがある場合は便利だと思います。
テーブル定義書いて出力
テーブル定義その1 (カラム型列挙テーブル)
ColumnTypesTable.scala - GitHub
Slickのテーブル定義です。Slickのテーブル定義ではJdbcProfile
が必要になりますが、DIで取ってくることが多いと思うのでそのようにいています。(それか直接MySQLProfile
などを参照するか。)
今回はせっかくなのでサンプルのテーブル定義はSlickのJDBCProfileでサポートされている型全てカラムに加えました。このテーブル定義はColumnTypesTable
と名付けています。
テーブル定義その2 (テーブル制約列挙テーブル)
TableConstraintsTable.scala - GitHub
もう1つ、テーブル定義を書いています。Slickのテーブル定義では複合主キーや外部キー、インデックスの設定などRDBにある多くのテーブル制約もかけるので、それらを書いたTableConstraintsTable
です。
標準出力するスクリプト
以下は、上記2つのテーブル定義のCREATE TABLE文とDROP TABLE文を出力するスクリプトです。ScalaTestで書いてsbt testOnly クラスパス
で実行する想定です。今はデータベースはMySQLを指定しています。
PrintSlickTableSchemas.scala - GitHub
今回はScalaTestを使いましたが、こう言ったスクリプトをまとめたsbtのsub-moduleを作ってそこに置いてもいいかもしれません。
Slickのカラム型 => MySQLのカラム型対応
ColumnTypesTableのCREATE TABLEの結果を最後に載せます。Slickのバージョンは3.3.2
です。
ColumnTypesTable.scala - GitHub
CREATE TABLE `column_types`( `int` INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, `long` BIGINT NOT NULL, `float` REAL NOT NULL, `double` DOUBLE NOT NULL, `big_decimal` DECIMAL(21, 2) NOT NULL, `string` TEXT NOT NULL, `char` CHAR(1) NOT NULL, `boolean` BOOLEAN NOT NULL, `byte` TINYINT NOT NULL, `byte_array` BLOB NOT NULL, `blob` BLOB NOT NULL, `clob` CLOB NOT NULL, `uuid` BINARY(16) NOT NULL, `date` DATE NOT NULL, `time` TIME NOT NULL, `timestamp` TIMESTAMP NOT NULL, `local_time` TEXT NOT NULL, `local_date` DATE NOT NULL, `local_date_time` TEXT NOT NULL, `offset_date_time` TEXT NOT NULL, `zoned_date_time` TEXT NOT NULL, `instant` TEXT NOT NULL )
一方TableConstraintsTable.scalaの出力結果はGitHubのリポジトリのREADMEで載せています。