Twitterもどきを作りながらGoogle App Engineの肝データストアを理解する

白石俊平(あゆた)
2008-04-14 17:00:00
  • このエントリーをはてなブックマークに追加

モデルオブジェクト

 今回の説明のために用意したサンプルは、複数人でメッセージをポストし、共有できるだけのアプリだ。まあ「Twitterもどき」といえなくもない(Twitterに失礼だが)。

今回のサンプル

 メッセージが一覧表示されている部分を見ると、このアプリが保存する必要のあるデータは「投稿した人」「メッセージ本文」「投稿日時」の3つだとわかる。

 RDBであれば、これらのデータを格納するためのテーブルを作成するところだ。App Engineのデータストアでは、どのようにしてデータのスキーマを表現するのか?

 App Engineのデータストアでは、「モデルオブジェクト」もしくは「エンティティ」と呼ばれるPythonクラスによってスキーマが表される。エンティティは、単にdb.Modelクラスを継承し、プロパティ(リレーショナルモデルでいうところの「カラム」)を定義しただけのクラスだ。上のデータを格納するためのエンティティ「Message」の定義を以下に示す。

class Message(db.Model):
    author = db.UserProperty()
    content = db.StringProperty()
    date = db.DateTimeProperty(auto_now_add=True)

 author、content、dateと言ったプロパティが定義されていることに注目。その値は「db.XXXProperty」となっている。これらが、エンティティで保持されるデータの実体となる。

 「db.XXXProperty」は、プロパティのデータ型を表すものだ。UserPropertyは「google.appengine.api.User」クラスのインスタンスを格納するための型、StringPropertyは文字列、DateTimePropertyはdatetime.datetime型にそれぞれ対応している。

 プロパティの型には他にも、BooleanやIntegerなどの基本型、複数データを格納できるListProperty、他のエンティティを格納するためのReferencePropertyなど、様々なものを利用できる。完全なリファレンスはこちらを参照していただきたい。

 エンティティのput()メソッドを呼び出せば、エンティティをデータストアに保存することができる。メッセージの保存を行っているコードを見てみよう。

# リクエストからメッセージ本文を取得
content = self.request.get("content")
# エンティティのインスタンスを作成
message = Message(author=user, content=content)
# データストアに保存
message.put()

 あっけないほど簡単に、データストアに対してデータの保存を行えてしまった。すばらしい開発効率だ。

 エンティティには、他にも様々なメソッドが定義されている。以下に挙げるのはその一部だ。完全なリストはリファレンスを参照していただきたい。

  • put()・・・モデルの保存
  • delete()・・・モデルの削除
  • to_xml()・・・XML形式(Atom/GDataに準拠)の文字列を返す。

開発用コンソールを用いたデータの確認

 データストアに保存されたデータは、開発用コンソールから確認することができる。開発用コンソールのURLは「http://localhost:8080/_ah/admin/」(ポート番号はデフォルト)だ。アクセスすると、「Datastore Viewer」と言うメニューがあるので、エンティティの種別(クラス名)を入力すればデータの一覧を取得できる。

Datastore Viewer
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]