Play framework with Scala を使ってみようシリーズです。
その1
その2
その3
その4
なんかすっかりPlay! on GAE with Scalaな感じになってきましたが、RDBMSでのサンプルはyabeに任せることにして、引き続きGAEをさわっていきます。
今回はDatastoreへのアクセスを見てみます。
Datastoreについては オープンソース徹底活用 Slim3 on Google App Engine for Java という本でかなり詳しく解説してありますので、こちらを参照してください。
今回のサンプルのソースは https://github.com/ueshin/play-hello/tree/play-hello-0.0.3 でブラウズできます。
その1
その2
その3
その4
なんかすっかりPlay! on GAE with Scalaな感じになってきましたが、RDBMSでのサンプルはyabeに任せることにして、引き続きGAEをさわっていきます。
今回はDatastoreへのアクセスを見てみます。
Datastoreについては オープンソース徹底活用 Slim3 on Google App Engine for Java という本でかなり詳しく解説してありますので、こちらを参照してください。
今回のサンプルのソースは https://github.com/ueshin/play-hello/tree/play-hello-0.0.3 でブラウズできます。
sienaモジュール
Datastoreを使うには、sienaモジュールを追加します。標準のJPAでも(制限付きで)Datastoreにアクセスできると思っていたんですが、GAEで利用できないAPIを内部で使っているらしく、エラーになってしまいました。
Sienaは、GAE/PyのDatastore APIにインスパイアされて実装したJava APIだそうです。
Siena is a single API with many implementations. You can use siena with relational databases, with the Google App Engine's datastore or with Amazon's SimpleDB. There is also an implementation called siena-remote very useful if you want to use the Google App Engine's datastore remotely. Other implmenetations are planned such as: HBase, DBSLayer,...
あまり複雑なことはできませんが、RDB、GAEのDatastoreだけでなく、Amazon SimpleDBやHBaseでも利用出来る(予定含む)そうで、ソースコードの再利用を考えるといいかもしれません。
インストール
install
コマンドを使ってインストールします。$ play install siena-1.3
設定
conf/application.conf
ファイルに、sienaモジュールを使うよう設定します。module.scala=${play.path}/modules/scala-0.8
module.gae=${play.path}/modules/gae-1.4
module.siena=${play.path}/modules/siena-1.3
これでsienaを使う準備ができました。
Model
クラス
まずModel
クラスを継承したエンティティクラスを実装します。このクラスが
Kind
となり、インスタンスがEntity
、フィールドがProperty
になります。id
値を表す@Id
アノテーションのついたLong
型のフィールド(フィールド名は任意)は必須です。LowLevelAPIでは文字列の
name
値も利用できますが、sienaではLong
のid
値のみとなっています。フィールドで利用出来るクラスは、Datastoreで利用出来るものと同じです。
リストプロパティにScalaの
List
は使えないので、JavaのList
を指定するように気をつけましょう。デフォルトコンストラクタが必須なので、忘れずに定義してください。
insert
/update
/delete
Model
クラスを継承すると、insert
/update
/delete
メソッドが使えます。それぞれデータの追加、更新、削除を行うメソッドになります。
id
値はinsert
時に自動採番され、値がセットされます。クエリ
コンパニオンオブジェクトでクエリを実装します。Model.all
メソッドでクエリオブジェクトを作成できますので、filter
/order
を設定した後にfetch
/get
/count
することでデータを取得できます。例) models/User.scala
id
、email
、joinedAt
、invitedAt
という4つのフィールドを定義してあります。コンパニオンオブジェクトにて、
all
メソッドをpublic
のままにしておけば、利用側でなんでもできるようになりますが、あまりなんでもできるようにすると管理ができなくなる恐れがあるので、いったんprivate
にして、外部から利用するのに必要なクエリだけを公開するようにしています。id
によるget
はOption
でくるんでおいたほうが何かと便利です。また、
fetch
したものはtoList
を付けておけばScalaのList
として扱うことができるようになります。(import _root_.scala.collection.JavaConversions._
を忘れずに。。。)サンプルアプリ
前回から引き続き、サンプルアプリを公開しています。ログインすると挨拶をポストできるようになります。
挨拶文は自分か、自分がフォローしている人のものを見ることができます。
フォローするには、Followings画面でフォローしたい人のメールアドレスを入力します。
フォロー後にポストされた挨拶文から見ることができるようになります。
相変わらず見た目がしょぼいのでどなたかがデザインをあててくれる事を切に願います。
Play Hello!