Play framework 2.0でAnormを使用する
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上のソースを見て主観的に判断しているので、ご意見ご感想のある方はぜひご指摘ください。