データストアのエンティティ

昨日の続きです。この書籍、内容はとても分かりやすいのですが、サンプルコードが断片的なので実際に動くコードを自分で書かないといけない。すごく為になるんですが、すごく時間がかかってしまいます。まぁ、そんなに急ぐこともないので、サンプルを作りながら進めていくコトにします。

エンティティの利用

キーを使ったエンティティの取得

ということで、エンティティをデータストアから引っ張ってくるのに公式サイトのチュートリアルではいきなりクエリを使ってまとめて取得していましたが、本書ではその前にエンティティのキーを使って狙い撃ちで取得する方法を勉強します。


前にも書きましたが、エンティティのキーはその名の通り、システム内でエンティティを一意に識別できる情報です。元々データストアがカバーするBigTableはキーと値 (Value) の組み合わせで情報が管理されています。ですので、条件を付けてクエリを発行するよりもキーを指定して直接エンティティを取得する方がずっと早いのです。


このキーですが、後から利用するのであれば、もちろん自前で設定するのですが、キーを直接指定するわけではありません。キーを構成する以下の情報を使ってキーを作り出した上で利用します。

  1. キー名 (デーストア登録時に自前で設定)
  2. 種別名


キーの作るにはdb.Key.from_pathメソッドを使います。

# Entitiyという種別でキー名がhogehogeのキーを生成
key = db.Key.from_path('Entity', 'hogehoge')    # 2


↑で取得したキーはHuman-readableじゃない値が入っています。たとえばこんな感じ。

ahFkZXZ-a2VtdW8tYWUtYm9va3ISCxIEQm9vayIIaG9nZWhvZ2UM


このキーを使ってエンティティを取得するには以下のようにします。

entity = Book.get(key)


もしこのキーに該当するエンティティがなければNoneを返します。なお、キー名やIDからエンティティを取得する方法もあります。こちらの方がキーを生成しない分楽ですね。

entity = Book.get_by_key_name(key_name)


この辺りの一連の操作が出来るいけてないサンプルをこちらに上げておきます。よかったらど〜ぞ。


Google Code: kemuo-ae-book

エンティティオブジェクトを調べる

ここではエンティティのプロパティの値の取得、更新方法が記載されています。一番直感的で分かりやすいと思うのは、オブジェクトのフィールドを使う方法だと思います。

entity = Book.get_by_key_name(key_name)
title = entity.title
author = entity.author
copyright_year = entity.copyright_year
author_birthdate = entity.author_birthdate


その他にはこんな感じのメソッドを使うことが出来ます。

title = getattr(entity,'title')
author = getattr(entity, 'author')
copyright_year = getattr(entity, 'copyright_year')
author_birthdate = getattr(entity, 'author_birthdate')


もちろん更新もまったく同じです。

エンティティの保存

続いてはエンティティの保存です。データストア的には生成と更新は同じです。更新はただ単に同じキーのエンティティが既に存在すれば上書きで保存するだけです。

entity1.put()    # エンティティ1をデータストアに保存
db.put(entity2)  # エンティティ2をデータストアに保存


まぁ、関数として呼び出しているか、メソッドとして呼び出しているかの違いですね。

エンティティの削除

削除もだいたい同じですね。ただキーを使ってエンティティを削除出来ます。キーを使った削除はフェッチを伴わないので早いのです。

# エンティティを直接削除
db.delete(entity)

# エンティティをキーで削除
key = db.Key.from_path('Book', key_name)
db.delete(key)