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!

