2008年4月15日
「Google App Engine」を使ってみた
Google App Engineとは、Googleの持つサーバやミドルウェアを外部に提供するサービスのことです。スケーラブルなサーバやGFS、BigTableを使えるということです。
1万人限定のプレビューには登録が間に合わなかったのですが、先ほど追加登録されたとのメールが送られてきましたので、早速使ってみました。
定番のHello worldを作るチュートリアルを行いました。既にあちこちに記事があるため、そちらを参照してください。
- 秋元@サイボウズラボ・プログラマー・ブログ: Google App Engineを使ってみた
- Google App Engine詳解:さっそくHello Worldから作ってみた - builder by ZDNet Japan
- 俺も俺も! Google App Engine! - IT戦記
Pythonに初めて触ったのですが、意外とすんなり作れました。インデントに意味があるというのは新鮮でした。って、これじゃGoogle App Engineの感想になりませんね。Google App Engineでは、データストアへのアクセスにSQLではなくGDLというSQLライクな言語を使うのですが、
greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC")
これを以下のようにも書けるのです。
greetings = Greeting.all().order('-date')
Greetingというモデルクラスがデータストアのテーブルと対応するのはRailsと同じなのですが、「全部持ってきて」「dateの逆順に並びかえ」と指定できるのはおもしろい。直感的ではあるのですが、これがどのように処理されるのか気になりました。データストアから全データを持ってきた後、アプリケーションサーバが並び替えることになりそうなので、重そうに感じるのですが・・・。Googleのサーバ能力からすれば、共有のデータストアに処理をさせるより、何千台もあるアプリケーションサーバが処理した方がいいということなんでしょうかねー。それともこの構文からクエリー指定と同じクエリーを生成出来るのかなぁ。Ruby脳だと「Greetingクラスのallメソッドを呼び出し」「その戻り値であるオブジェクトの配列に対して、orderメソッドを引数'-date'で呼び出す」となるんですが。リファレンスを読むことにします。
ここから追記
リファレンスを読んで謎が解けました。all(),order(),filter()などを呼び出した時点ではまだ実際のデータ検索処理は行われていないのです。実際にフェッチされるのは、以下の2つのどちらかになります。
-
fetch()が呼び出されたとき
greetings.fetch(10)
-
イテレータとして使われたとき
for greeting in greetings:
なるほど、all(),order(),filter()はQueryオブジェクトに条件を追加していく動作になるわけですね。
greetings = Greeting.all() # SELECT * FROM Greetings
greetings.filter('owner = ', users.get_current_user()) # SELECT * FROM Greetings WHERE owner = :1
greetings.order('-date') # SELECT * FROM Greetings WHERE owner = :1 ORDER BY date DESC
これらのメソッドはレシーバの状態を更新し、更新後のレシーバを返すので、以下のように書くことも出来ます。
greetings = Greeting.all().filter('owner = ', users.get_current_user()).order('-date')
余談ですが、WHERE句は左辺値の後にスペースを入れないと動作しないようです。ちょっとはまりました。
greetings.filter('owner=' users.get_current_user()) #これは動作しない
greetings.filter('owner =' users.get_current_user()) #これでOK
Trackback on "「Google App Engine」を使ってみた"
このエントリーのトラックバックURL:
"「Google App Engine」を使ってみた"へのトラックバックはまだありません。
"「Google App Engine」を使ってみた"へのコメントはまだありません。