11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Play FrameworkのEvolustionsを試してみた

Last updated at Posted at 2016-05-28

Play FrameworkのDBマイグレーションツールであるEvolustionsを試してみたので、自動でテーブルが生成されるまでの流れを簡単に説明します。

動作環境

OS OSX
Play Framework 2.3.8
データベース PostgreSQL 9.4.5

DBマイグレーションツールとは?

DBマイグレーションツールとは、データベーススキーマのCI(継続的インテグレーション)を実現することが出来るツールです。
アプリケーションをデプロイする度に、サーバ側のデータベースに接続して、手作業でデータベースのスキーマを構築するのは非常に面倒です。
DBマイグレーションツールを利用することで、アプリケーションをデプロイした際にデータベースのスキーマの差異を識別し、自動でスキーマ構築を行うことが出来るようになります。

エボリューション・スクリプトを作成

最初に、conf/evolutions/default内に1.sqlを以下の内容で作成します。

# Usersテーブルを生成

# --- !Ups
CREATE TABLE users(id serial, name text);

# --- !Downs
DROP TABLE users;

1.sqlのことをエボリューション・スクリプトと呼びます。
スクリプトは以下の2つパートから構成されています。

  • Upsパート : 必要なスキーマの生成や変更を行うsqlを記述
  • Downsパート : Upsパートを打ち消すsqlを記述

データベースを作成

ターミナル上で以下のコマンドを実行して、アプリケーションで利用するデータベースを作成します。

$ createdb testdb;

application.confの設定

conf/application.confに接続先のデータベースの設定を記述します。

db.default.driver = org.postgresql.Driver
db.default.url = "jdbc:postgresql://localhost/testdb"

build.sbtを編集

build.sbtにPostgreSQLのドライバーを追記します。

libraryDependencies += "org.postgresql" % "postgresql" % "9.4.1208.jre7"

エボリューション・スクリプトの実行

Play Framewarkを起動し、localhost:9000にアクセスしてみます。
以下の画面が表示されるので、Apply this script now!と書かれたボタンをクリックすることで、Upsパートで記述されたCREATE TABLE users(id serial, name text);が実行され、データベース上にusersテーブルが自動で生成されます。

スクリーンショット 2016-05-23 23.40.48.png

データベースのスキーマは以下のようになります。

testdb=# \d
 Schema |       Name        |   Type   |  Owner 
--------+-------------------+----------+----------
 public | play_evolutions   | table    | hoge
 public | users             | table    | hoge
 public | users_user_id_seq | sequence | hoge

テーブルのスキーマを変更する

既存のスキーマを新たに変更したい場合は、以下のように2.sqlを新たに作成し、変更の内容を記述していきます。

# Usersテーブルにカラムを追加

# --- !Ups
ALTER TABLE users ADD COLUMN age INTEGER;

# --- !Downs
ALTER TABLE users DROP COLUMN age;

localhost:9000にアクセスしてみます。

スクリーンショット 2016-05-23 23.41.17.png

2.sqlが適用されてusersテーブルにageカラムが追加されます。

testdb=# \d users
                            Table "public.users"
 Column  |  Type   |                        Modifiers                      
---------+---------+---------------------------------------------------------
 user_id | integer | not null default nextval('users_user_id_seq'::regclass)
 name    | text    | 
 age     | integer | 

Downsパートの役割について

1.sqlの記述を以下の内容に変更して、localhost:9000にアクセスしてみます。

# Usersテーブルを生成

# --- !Ups
# カラム名をid => user_id に変更する
CREATE TABLE users(user_id serial, name text);

# --- !Downs
DROP TABLE users;

スクリーンショット 2016-05-23 23.41.36.png

Downsパートは既存のx.sqlに変更があった場合に実行されます。
Downsパートを実行することで、ある特定の状態までデータベースを戻し、Upsパートを実行することで、x.sqlの変更を自動的にデータベースに適用させることができます。
今回の場合は、1.sqlが更新されたため、1.sql,2.sqlのDownsパートを実行することでデータベースの状態をの1.sqlのUpsパートが実行される前の状態まで戻し、再び1.sql,2.sqlのUpsパートが実行されます。

スクリプトの実行確認をしたくない場合

application.confに以下を追記することで、Playは確認をせずエボリューション・スクリプトを自動実行します。

applyEvolutions.default = true  # Ups パートを自動で実行する
-DapplyDownEvolutions.default = true # Downs パートを自動で実行する

公式のドキュメントでば以下の理由から-DapplyDownEvolutions.default = true
application.confに記述することは推奨されていません。

もし Play によって算出されたエボリューション・スクリプトが DOWN エボリューションしか持っていなく、このプロパティが設定されていない場合 Play はこれを実行せず、サーバーも起動しません。

参考文献

Evolutions
https://www.playframework.com/documentation/ja/2.3.x/Evolutions

11
10
0

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
11
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?