Play Frameworkを始めてみました。play-slick-evolutionsでSQLからMySQLのテーブル自動生成というのを2日くらい頑張ってやったのでやり方を書いてみます。

環境


お約束の環境です。

  • Play Framework 2.5.14
  • MySQL 5.7.12

build.sbt


play-slickplay-slick-evolutionsmysql-connector-javaを追加します。

1
2
3
4
5
libraryDependencies ++= Seq(
"com.typesafe.play" %% "play-slick" % "2.0.2",
"com.typesafe.play" %% "play-slick-evolutions" % "2.0.2",
"mysql" % "mysql-connector-java" % "5.1.36"
)

この時にMavenにmysql-connector-javaの6.0.6があるからと言って「最新使おうぜっ!!」と思って6.0.6を使用してはいけない。フツーにDBに接続できない…。ので、ネットで見かけたサンプルの5.1.36を使用することにしました。

また、最初は「MariaDB使ったるでっ!!」ってMariaDBでやろうとしたけど、Slick3はMariaDBサポートしてないのでコレもダメ。クラスを自作したらいけるようですが、そこまでのスキルがまだないので、これも諦めました。

後はPlay Framework websitebuild.sbtをパクって依存ライブラリにjdbcを記述していたのですが、これもダメだった。こちらの記事playframeworkでslickを使ってDBにアクセする際にハマったのでメモが参考になりました。

application.conf


conf/application.confに使用するドライバや接続情報を書きます。スキーマとかユーザは環境にあわせて変更してください。

1
2
3
4
5
6
7
slick.dbs.default.driver="slick.driver.MySQLDriver$"
slick.dbs.default.db.driver="com.mysql.jdbc.Driver"
slick.dbs.default.db.url="jdbc:mysql://127.0.0.1:3306/test"
slick.dbs.default.db.user="root"
slick.dbs.default.db.password=""

play.evolutions.enabled=true

SQL書いてみる


conf/evolutions/defaultディレクトリに連番でsqlファイルを作ります。ディレクトリがない場合は作る。今回は1.sqlというファイル名で下記のようなSQLを書いてみました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# --- !Ups
CREATE TABLE ACCOUNT(
ID BIGINT(20) NOT NULL AUTO_INCREMENT,
USER_NAME VARCHAR(255) NOT NULL,
PASSWORD VARCHAR(255) NOT NULL,
IS_ADMIN BOOLEAN DEFAULT false,
CREATED_AT DATETIME DEFAULT CURRENT_TIMESTAMP,
UPDATED_AT DATETIME DEFAULT NULL,
DELETED_AT DATETIME DEFAULT NULL,
PRIMARY KEY (ID)
) DEFAULT CHARSET=utf8;


INSERT INTO ACCOUNT (USER_NAME, PASSWORD, IS_ADMIN) VALUES ('admin', 'passwd', true);

# --- !Downs
#DROP TABLE ACCOUNT;

「INSERT文でパスワードそのまま放り込んでるじゃね~か!!」とかいうツッコミはやめて…。これテストだからねっ。ね…。

実行してみる


あとはsbt run実行してブラウザで接続してみます。

エッボリューション!!と怒られるので「Apply this script now!」を押します。「俺のSQLはエッボリューションだ!! 」

で、こんな感じでテーブルができて、データが入ってる。

詰まったところとか勘違いしてたところ


  • 各々のライブラリが何かわかっていなかった
    • play-slick-evolutionsでテーブル作成~コード自動生成までやってくれると思っていた
    • play-slick-evolutionsはSQLからテーブルの作成まで
    • テーブルに基づいたコードの自動生成はslick-codegenで行う
    • さらにTypesafe Activatorなるものも存在し、余計混乱した
      • 未だに何かわかってない

上記のあたりを理解するまで結構時間が掛かってしまいました。だって、あんまり情報なかったんだもん…日本語の…

またslick-codegenを使用してテーブルを基にしたコードの自動生成もやってみたのですが、どうも一つのファイルにまとめられてしまう(?)ようで(もしかしたらやりかたあるかもしれませんが)テーブルに対応するモデルは自分で書くことにしました。自動生成はたぶん、また別の記事で書くと思います。

エボリューションのSQL作成のあたりはScala逆引きレシピを参考にさせて頂きました。