2009年11月22日

Google App Engine のDatastore を irb でいじってみる

Google App Engine のDatastoreはRDBとも単純なハッシュとも違う構造だ。

まだよく理解ができていないため、いろいろメソッドを叩いて試行錯誤しているのだけど、1箇所変えるたびに保存してアップしてバージョン切り替えして、というのは面倒。。。そんな中、コマンドプロンプト上でGAE用のirb(rails でいうところの、script/console みたいなもの)を動かす方法を知った。これは便利。
appcfg.rb.bat run -S irb
これで、require 'appengine-apis/datastore' すればdatastoreが使えるようになる。あとはAPIリファレンスなどを見ながらいろいろ試してみるだけ。
require 'appengine-apis/datastore'

include AppEngine
include AppEngine::Datastore

e = Entity.new('thekind', 'keydesuyo')
e[:name] = 'T-1039'
e[:year] = '1986'
k = Datastore.put e
■情報参照方法その1:キーを指定して get
Datastoreからgetする場合の引数はKeyオブジェクト(Kind名と値から成る)である必要がある。
Datastore.get(key)

なお、get で検索して該当するデータがなかった場合は AppEngine::Datastore::EntityNotFound エラーが発生する。

●getの引数となる key オブジェクトの取得の仕方
  • put 時の戻り値として得られるオブジェクトの name か id_or_name を使う(上記のコードの例でいうと、k.name か k.id_or_name)
  • Kind名と値の文字列からKeyオブジェクトを生成する方法は Key.from_path('エンティティ名', '値') 。
  • Keyオブジェクトを to_s すると「agdtYXFjZTAxchYLEgd0aGVraW5kIglrZXlkZXN1eW8M」 のような文字列が取得できる。この文字列からKeyオブジェクトを復元するには Key.new('agdtYXFjZTAxchYLEgd0aGVraW5kIglrZXlkZXN1eW8M')のようにする。
■情報参照方法その2:クエリーで取り出すとき
まず、抽出条件を表すQueryオブジェクトを作り、fetch を実行するとEntityかEntityのリストが取得できる、という形で検索を行う
q = Query.new('thekind')
r = q.entity(該当が一つだけの場合。複数あるとException発生)。
rs = q.fetch (全エンティティを取り出す場合。あとで each して個々の値を取り出す)
フィールドの値を指定して絞り込むような操作はQueryオブジェクトを filter して行う。rails の all(:conditions => {:name => 'T-1039'}) みたいな感じ?
q = Query('Kind名').filter('フィールド名', Entity::EQUAL, '検索値')
q.fetch.each{|iii|
p iii[:name]
}
ソートする場合は fetch 前にクエリのインスタンスに対して sort を実行しておく。下記は降順ソートの例。
q.sort('フィールド名', AppEngine::Datastore::Query::DESCENDING)


maru_tak at 01:25│Comments(0)TrackBack(0)

トラックバックURL

コメントする

名前
URL
 
  絵文字