Play framework 2.0でAnormを使用する

2011.10.19

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

まとめ

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

参考サイトなど