Play Framework を始めたばかりの方向けに、サンプルを進めるうえで困ったところを共有する目的で書いています。
Scalameta 4.4.x を使って、Case object から PostgreSQL ENUM の create type コマンドを作成したときのメモです。
以下、目次
やりたいこと
こんな感じの enum っぽい case object から、
import enumeratum.Enum import enumeratum.EnumEntry sealed trait Medal extends EnumEntry case object Medal extends Enum[Medal] { case object Gold extends Medal case object Silver extends Medal case object Bronze extends Medal lazy val values: IndexedSeq[Medal] = findValues }
こんな感じの sql コマンドを作成したい。
create type "medal" as enum ('Gold', 'Silver', 'Bronze');
背景
- SQL のマイグレーションに、Flyway を利用
- DB -> Case Class は、slick-codegen を利用
- 列挙型を、DB < = > scala code 間で一致させたい
結果
Scalameta 4.4x を利用して、「case object -> sql: create type as enum 作成」した。 これにより、
「case object -> sql: create type as enum」
-> (Flyway を利用して)「sql file -> DB」
-> (slick-codegen を利用して)「DB -> Case class 」
-> (root のアプリから)「Case class -> DB access」
みたいなことができました。
「case object -> sql: create type as enun」の詳細
全体像
- sub project
macro_test
のCaseObjectToSqlEnum
が、 input
ファイルを pattern match syntax trees し、(https://github.com/hakataminamiWS/macrotest/blob/f3bc7896427810e0599dd98d741c33ef2c495277/macro_test/src/main/scala/CaseObjectToSqlEnum.scala#L14-L61)case object foo extends Enum[bar] { ... }
のような tree があれば、output
に sql コマンドとして書き出す。(https://github.com/hakataminamiWS/macrotest/blob/f3bc7896427810e0599dd98d741c33ef2c495277/macro_test/src/main/scala/CaseObjectToSqlEnum.scala#L78-L90)
参考にしたところ
面白かったけど関係なかったところ
以上でした。