Web開発のしおりRepository

Webエンジニアリング関連の技術記事を掲載させていただいております。

Slick (Scala) のテーブル定義からSQLのCREATE TABLE文を標準出力するだけ (MySQLでのカラム型一覧あり)

目次:

なにがしたい

Scalaのデータベース処理のライブラリであるSlickで、Slickのテーブル定義(クラス定義)からSQLのCREATE TABLE文を標準出力したいです。 Slickのテーブル定義(クラス定義)を書いて、それからまた同じDBマイグレーションのためのSQLファイルを書くケースでは、何度も1から書くのは避けたいですよね。 あと、Slickがサポートしているカラムの型が結局DBでなにの型になるのかよくわからないので、それを一覧で確認したい次第です。

コード:

github.com

↓ データベースのテーブルスキーマから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で載せています。