概要
scalaのweb frameworkのデファクトとなっているplayでデータベース環境を構築する。
使用するのはpostgresqlでORM(ホントはFRMと言うらしい)はscalaを作っているlightbend作のslickを使う。
また、データベース運用で必須のマイグレーションツールはevolutionsを使用する。
この記事で書くこと
- playプロジェクトの作成方法
- slickは環境構築まで
- evolutionsの環境構築とマイグレーションの運用方法
この記事で書かないこと
- slickのモデル運用方法
- evolutionsのマイグレーションファイルの詳しい書き方
環境
- Scala2.12.8
- Play 2.7.2
前提
- Sbtのインストール
- Scalaのインストール
- postgresqlのインストール
1.playプロジェクトの作成
好きなディレクトリに移動した後、以下のコマンドを打つ。
sbt new playframework/play-scala-seed.g8
すると、
name [play-scala-seed]:
と出るので好きなアプリ名を入力してエンター。
作成されたアプリ名のディレクトリに移動し、playを起動。
sbt run
http://localhost:9000/ にアクセスし、以下の画面が出れば成功。
2.postgresqlでdbを作成する
ターミナルで以下のコマンドを打つ。
create test-db;
その後、以下の用になれば成功。
~ ❯❯❯ psql -d test-db
psql (11.3)
Type "help" for help.
test-db=#
3.slickの導入
プロジェクト直下のbuild.sbt
を編集する。
以下を追記。
...
libraryDependencies += "com.typesafe.play" %% "play-slick" % "3.0.1"
また、conf/application.conf
も編集。
urlの設定で、portをpostgresのportにすることが必要。
以下のコードではデフォルトの5432
を使用している。
また、urlの最後は作成したdb名にすることに注意。
slick.dbs.A.~
で設定を書いた場合、A
がslickの中でのdb名になる。
...
slick.dbs.default.db.url = "jdbc:postgresql://localhost:5432/test-db"
slick.dbs.default.profile="slick.jdbc.PostgresProfile$"
slick.dbs.default.db.properties.driver = "org.postgresql.Driver"
ここまでした後に、sbt run
でplayを再起動し、先ほどの画面が出れば成功。
4.evolutionsでのマイグレーション
build.sbt
を編集。
公式ではjdbcも依存に加えているが、入れるとエラーが出て、入れなくても動くので削除。
...
libraryDependencies ++= Seq(evolutions)
libraryDependencies += "org.postgresql" % "postgresql" % "42.1.4"
libraryDependencies += "com.typesafe.play" %% "play-slick-evolutions" % "3.0.1"
次にconf/evolutions/default
ディレクトリを作成し、配下ににマイグレーションファイルを配置していく。
試しに、以下のファイルを1.sql
という名前で作成する。
-- Users schema
-- !Ups
CREATE TABLE User (
id bigint(20) NOT NULL AUTO_INCREMENT,
email varchar(255) NOT NULL,
password varchar(255) NOT NULL,
fullname varchar(255) NOT NULL,
isAdmin boolean NOT NULL,
PRIMARY KEY (id)
);
-- !Downs
DROP TABLE User;
作成した後、playを起動すると以下のような画面が出る。
Apply this script now!
ボタンを押すと、マイグレーションファイルがdbに適用され、元のページに戻る。
その後、2.sql
という名前で以下のファイルをconf/evolutions/default
以下に作成する。
-- Add Post
-- !Ups
CREATE TABLE Post (
id bigint(20) NOT NULL AUTO_INCREMENT,
title varchar(255) NOT NULL,
content text NOT NULL,
postedAt date NOT NULL,
author_id bigint(20) NOT NULL,
FOREIGN KEY (author_id) REFERENCES User(id),
PRIMARY KEY (id)
);
-- !Downs
DROP TABLE Post;
すると、先ほどのスキーマ適用画面が出るので同様に適用。
まとめ
意外とこの構成でまとめられている記事はなかったので、何かの助けになれば幸いである。
逆にこれ以外のベスト・プラクティスがあればぜひコメントをお願いします。