Locked History Actions

Play/DB

DBアクセス

Playでは単一のデータベースの存在を前提としており、それに従うのであれば簡単にデータベースの変更を取り扱うことができる。 JPA経由でHibernateを使う方法や、複数のデータベースや、GAE等を利用することはここでは考えない。

エボリューションスクリプト

エボリューションスクリプトは、データベースの変更方法をsqlとして記述しておくことによりplayがその面倒を見てくれるというものである。

http://playdocja.appspot.com/documentation/1.2/evolutions

エボリューションスクリプトのディレクトリは「プロジェクトトップ/db/evolutions」となっているが、このディレクトリはデフォルトインストールでは作成されていないので、自分で作成する必要がある。

エボリューションスクリプトによらない方法

エボリューションスクリプトによる方法は大変便利ではあるが、実用的ではない。 開発過程におけるデータベース構造変更時はこれで十分だが、実運用後に変更する場合には、既にあるデータを別テーブルあるいは別データ形態に変換する必要が出てくる(例えば、複数のテーブルデータだったものをまとめて直列化データにしBLOBに入れるなど)。

この場合には当然SQLの記述では不十分である。どうしても自力でデータベース構造の変更とデータの処理を行う必要が出てくる。

playには「起動時に実行するジョブ」の定義機能があるので、これを使う。

http://playdocja.appspot.com/documentation/1.2/jobs

まず、どのようなパッケージ名、どのようなファイル名、どのようなクラス名でもよいので、次のような記述を行う。

import play.jobs._

@OnApplicationStart
class StartJob extends Job {
    override def doJob {
      println("startup!!!")
      ....
    }
}

あとは、データベース変更に必要な記述をすればよい。

ただし、注意点としては、「開発モード」では、システム起動時だけではなく、任意のタイミングでこれが呼び出されてしまう可能性があること。