LoginSignup
5

More than 3 years have passed since last update.

postgresql+slick+evolutionsでscala+playのデータベース周りの環境を構築する

Last updated at Posted at 2019-06-12

概要

scalaのweb frameworkのデファクトとなっているplayでデータベース環境を構築する。
使用するのはpostgresqlでORM(ホントはFRMと言うらしい)はscalaを作っているlightbend作のslickを使う。
また、データベース運用で必須のマイグレーションツールはevolutionsを使用する。

この記事で書くこと

  1. playプロジェクトの作成方法
  2. slickは環境構築まで
  3. evolutionsの環境構築とマイグレーションの運用方法

この記事で書かないこと

  1. slickのモデル運用方法
  2. evolutionsのマイグレーションファイルの詳しい書き方

環境

  • Scala2.12.8
  • Play 2.7.2

前提

  1. Sbtのインストール
  2. Scalaのインストール
  3. postgresqlのインストール

1.playプロジェクトの作成

好きなディレクトリに移動した後、以下のコマンドを打つ。

shell
sbt new playframework/play-scala-seed.g8

すると、

shell
name [play-scala-seed]: 

と出るので好きなアプリ名を入力してエンター。
作成されたアプリ名のディレクトリに移動し、playを起動。

shell
sbt run

http://localhost:9000/ にアクセスし、以下の画面が出れば成功。

image.png

2.postgresqlでdbを作成する

ターミナルで以下のコマンドを打つ。

shell
create test-db;

その後、以下の用になれば成功。

shell
~ ❯❯❯ psql -d test-db
psql (11.3)
Type "help" for help.

test-db=#

3.slickの導入

プロジェクト直下のbuild.sbtを編集する。
以下を追記。

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名になる。

application.conf
...

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も依存に加えているが、入れるとエラーが出て、入れなくても動くので削除。

build.sbt
...

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という名前で作成する。

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を起動すると以下のような画面が出る。

image.png

Apply this script now!ボタンを押すと、マイグレーションファイルがdbに適用され、元のページに戻る。

その後、2.sqlという名前で以下のファイルをconf/evolutions/default以下に作成する。

2.sql
-- 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;

すると、先ほどのスキーマ適用画面が出るので同様に適用。

まとめ

意外とこの構成でまとめられている記事はなかったので、何かの助けになれば幸いである。
逆にこれ以外のベスト・プラクティスがあればぜひコメントをお願いします。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5