blogこの広告は、90日以上更新していないブログに表示しています。2012-11-28Play2.1RC+Scala+SlickでTODOチュートリアルを作成するPlay2.1からはデフォルトのORMがAnormからScalaQueryに変更されるって話を聞いたのでPlayFramework2.0のTODOチュートリアルをPlay2.1+Scala+Slickで書き直してみようと思います。2.1RC1の導入ですがこちらからPlay2.0.4で作ったプロジェクトをPlay2.1RC1で利用できるようにするためにはいろいろ変更の必要があります。今回は大人しくPlay2.1RC1で作成したアプリケーションを利用しましょう。Slickの導入です。"0.11.2"」を追加するだけです。Slickでチュートリアルで作成したTask.scalaを書き換えてみましょう。}}変更点を上から順に追っていきましょう。Slickを利用する際には下記の二つをインポートすればOKなようです。classを利用せず結果をタプルで返すことも出来ますが今回は出来るだけ以前のソースコードを変更しないようそのままにしておきます。次のobjectがSlickのキモの部分になります。id}この宣言でテーブルの定義が完了したも同然となります。Anormで1.sqlで直に書くよりはすっきりした・・・かもしれません。Tableを継承することを忘れないように。objectにdefで宣言されているid,labelがそれぞれTASKテーブルのカラムになります。O.PrimaryKeyは主キーの宣言に用います。複合主キーである場合は宣言方法が異なります。O.AutoIncを利用することでシーケンスを用いてIDを自動採番します。O.NotNullはNotNull制約の宣言になります。調べた限りではPrimaryKeyでないがUniqueであるカラムを宣言できないように見えます。誰かご存知の方がいらしたらご教授ください。パーサーでセレクト文を利用した際の戻り値の形式をここで決めているようです。insはインサートを行う際に利用します。今回はシーケンスを利用した自動採番を用いているのでこれを宣言しています。次に実際にDBでCRUD操作を行う関数です。}上記のように一切SQL文を記述することなくAnorm版と同様の結果を取り出せます。connectDBですがこれはDBアクセスの際必要となる記述を高階関数として宣言しています。このあたりScalaの便利なところですね。allではTASKテーブルに登録されている情報をID順に整列し、リスト化して取り出しています。createではlabelをDBに登録します。ちなみに以下のように書いても同じように動作します。Tasks.label.insert(lable)deleteはwhereによって条件を絞り込み削除。上記の変更に伴いApplication.scalaも一部変更になります。}}Taskとして呼び出していた部分をTasksに書き換えています。Anormでは1.sqlがアプリケーション起動時に実行されていたので必要ありませんでしたが今回はアプリケーション起動時にテーブルの作成をGlobal.scalaに記述します。Global.scalaという名前でapp/に配置してください。}}Tasks.ddl.createでテーブルの作成を行っています。以上で行うことでSlickを利用してチュートリアルのTODOアプリケーションの完成です。便利なSlickですがあまりドキュメントが見当たらずこちらからテストなどを元に調査している状態です。Slickを利用する上で注意しなければいけないのはテーブルにカラムが23以上存在する場合です。23という数字でピンとくるかもしれませんがTuple22問題が直撃してます。テーブルの宣言でタプル内に23個以上宣言するとコンパイルを通りません。classを利用した場合ですがこちらも23個以上フィールドをもてないのでアウトです。classをネストするといった方法があるようです。tuple22問題対策とUnique宣言する方法は調査中です。追記PrimaryKeyではないがUniqueを利用したい場合について以下のようにindexを定義してやることでUniqueをつけることできます。classをネストさせる。タプルをネストさせるといった手段が取られているようです。アプリケーション月別アーカイブはてなブログをはじめよう!takashima0411さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。