「Google App Engine」を使ってみた

Google App Engineとは、Googleの持つサーバやミドルウェアを外部に提供するサービスのことです。スケーラブルなサーバやGFS、BigTableを使えるということです。

1万人限定のプレビューには登録が間に合わなかったのですが、先ほど追加登録されたとのメールが送られてきましたので、早速使ってみました。

定番のHello worldを作るチュートリアルを行いました。既にあちこちに記事があるため、そちらを参照してください。

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つのどちらかになります。

  1. fetch()が呼び出されたとき

    greetings.fetch(10)

  2. イテレータとして使われたとき

    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

シェアする

  • このエントリーをはてなブックマークに追加

フォローする