Play framework 2.0でAnormを使用する

2011.10.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Anormとは?

今回もPlay2.0で最近追加された機能を試してみます。 先日のコミットで、Anorm ※1パッケージがコミットされました。AnormとはPlay1.2.x現在、 play-scalaモジュールの1機能として提供されているDBアクセスのためのライブラリです。 基本はSQLを直接記述する形で使用し、Scala言語のパワーを活用してSQL実行/結果解析をサポートします。詳しくは参考サイトを御覧ください。 2.0からはplayの依存を排除して、独立したパッケージとして提供されるようです。

注意: この記事ではまだαリリース段階の、しかもHEADを使用して試しています。 HEADはほぼ毎日のように更新されており、思わぬ不具合が生じるかもしれませんので、ご了承ください。

ソースのHEADを取得してセットアップ

まだgithubからソースを取得していない人は、play2.0のソースを取得しましょう。

$ git clone https://github.com/playframework/Play20.git

すでにソースを取得している人は、最新の状態に更新してください。

$ git pull

これで現状のソースを取得できます。 ソースを取得したらビルドしましょう。今回はanormライブラリをリポジトリに登録する必要があるので、少しだけ手順が追加されます。

$ cd Play20/framework
$ ./build
> publish-local
> build-repository

publish-localを実行して、anormライブラリをivyリポジトリに追加します。 これで準備ができました。

サンプルアプリケーション作成

今回はAnormライブラリを使用して、MySQLデータベースに接続して簡単なselect文を発行するだけの単純ななサンプルアプリを作成します。 Play20/samplesの下に、anormという名前のディレクトリを作成しましょう。

$ cd Play20/samples
$ mkdir anorm
$ cd anorm
$ ../../play new

これでプロジェクトが作成されます。

次に、アクセスするMySQLデータベースを作成します。 MySQLをインストールして起動後、下記コマンドをmysqlのコンソールから実行してください。

>create taeble anorm;
>create table user (id INT NOT NULL AUTO_INCREMENT,name VARCHAR(255), PRIMARY KEY(id));
>insert into user values (1,"taro");
>insert into user values (2,"syuta");

anormという名前でスキーマを作成し、シンプルなuserテーブルを作成。データを2件いれておきます。

次はproject/Build.scalaファイルを編集して、依存ライブラリを追加します。

import sbt._
import Keys._

object ApplicationBuild extends Build {

    val appName         = "anorm"
    val appVersion      = "0.1"

    val appDependencies = Seq(
		"play" % "anorm_2.9.1" % "2.0"
    )

    val main = PlayProject(appName, appVersion, appDependencies)

}

appDependencies変数にanormライブラリを指定しています。

次にconf/application.confファイルにデータベースの設定情報を記述します。 先ほど作成したデータベース名など必要事項を指定してください。

# Configuration

application.name=anorm

# Default database configuration
db.default.driver=com.mysql.jdbc.Driver
db.default.url=jdbc:mysql://localhost/anorm
db.default.user=<your user>
#db.default.password=<your pass> パスワードを設定している場合
db.default.isolation=READ_COMMITTED
db.default.logStatements=true

最後にテスト用コントローラーを作成します。 http://localhost:9000にアクセスすると、DBへセレクト文を発行して結果をコンソールに表示します。

package controllers
  
import play.api.mvc._
import play.api.mvc.Results._
import play.api.mvc.Results._
import play.api.Play.currentApplication
import play.api.db._

import anorm._ 

object Application extends Controller {
 
    def index = Action {
	implicit val connection = DB.getConnection()
	val selectUsers = SQL("Select * from user")
	val users = selectUsers().map(row => 
		       row[Int]("id") -> row[String]("name")).toList
   
	for(user <- users) println(user)

	Ok(views.html.index("anorm"))
    }
}

DB.getConnection()を呼び出すと、データベースへのコネクションを取得します。 取得したコネクションにimplicitをつけておき、SQLオブジェクト実行時に自動で渡されるようにしておきます。 SQL実行結果は(Int,String)要素のToupleのリストになります。 ちょっと強引な記述ですが、動作確認できるはずです。

まとめ

さて、今回はDBアクセスライブラリであるAnormを使用してみました。現在は使用するのがちょっとだけ面倒ですが、 開発が進めばデフォルトで使用できるようになるはずです。 Anormは非常に簡単に使用することができて、柔軟性もあります。いまのうちに使用方法を覚えておけば、Play2.0でも役に立つと思います。 ※この記事はあくまで私がgithub上のソースを見て主観的に判断しているので、ご意見ご感想のある方はぜひご指摘ください。