Play framework with Scala その5

| # Comments | 2 Trackbacks
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 でブラウズできます。

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ではLongid値のみとなっています。

フィールドで利用出来るクラスは、Datastoreで利用出来るものと同じです。
リストプロパティにScalaのListは使えないので、JavaのListを指定するように気をつけましょう。

デフォルトコンストラクタが必須なので、忘れずに定義してください。

insert/update/delete

Modelクラスを継承すると、insert/update/deleteメソッドが使えます。
それぞれデータの追加、更新、削除を行うメソッドになります。
id値はinsert時に自動採番され、値がセットされます。

クエリ

コンパニオンオブジェクトでクエリを実装します。

Model.allメソッドでクエリオブジェクトを作成できますので、filter/orderを設定した後にfetch/get/countすることでデータを取得できます。

例) models/User.scala

idemailjoinedAtinvitedAtという4つのフィールドを定義してあります。

コンパニオンオブジェクトにて、allメソッドをpublicのままにしておけば、利用側でなんでもできるようになりますが、あまりなんでもできるようにすると管理ができなくなる恐れがあるので、いったんprivateにして、外部から利用するのに必要なクエリだけを公開するようにしています。

idによるgetOptionでくるんでおいたほうが何かと便利です。
また、fetchしたものはtoListを付けておけばScalaのListとして扱うことができるようになります。(import _root_.scala.collection.JavaConversions._を忘れずに。。。)

サンプルアプリ

前回から引き続き、サンプルアプリを公開しています。

ログインすると挨拶をポストできるようになります。
挨拶文は自分か、自分がフォローしている人のものを見ることができます。

フォローするには、Followings画面でフォローしたい人のメールアドレスを入力します。
フォロー後にポストされた挨拶文から見ることができるようになります。

相変わらず見た目がしょぼいのでどなたかがデザインをあててくれる事を切に願います。

Play Hello!

トラックバック(2)

Play framework with Scala を使ってみようシリーズです。... 続きを読む

Play framework with Scala を使ってみようシリーズです。... 続きを読む

comments powered by Disqus

Twitter Icon

AdSense

Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。
Powered by Movable Type 5.14-ja

Google検索

カスタム検索

2013年10月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31