Ruby で Windows Azure Storage テーブルを操作するには

Github にある johnnyhalife/waz-storage · GitHub ライブラリを使うと簡単に操作できます。Windows Azure Storage REST API のラッパーになってます。

Rubygems でインストール
$ sudo gem install waz-storage
Fetching: mime-types-1.17.2.gem (100%)
Fetching: rest-client-1.6.7.gem (100%)
Fetching: ruby-hmac-0.4.0.gem (100%)
Fetching: waz-storage-1.1.1.gem (100%)
Successfully installed mime-types-1.17.2
Successfully installed rest-client-1.6.7
Successfully installed ruby-hmac-0.4.0
Successfully installed waz-storage-1.1.1
4 gems installed
Installing ri documentation for mime-types-1.17.2...
Installing ri documentation for rest-client-1.6.7...
Installing ri documentation for ruby-hmac-0.4.0...
Installing ri documentation for waz-storage-1.1.1...
Installing RDoc documentation for mime-types-1.17.2...
Installing RDoc documentation for rest-client-1.6.7...
Installing RDoc documentation for ruby-hmac-0.4.0...
Installing RDoc documentation for waz-storage-1.1.1...
認証

waz-storage ライブラリの認証方法は Base のクラスメソッド establish_connection! にアカウント名、アクセスキー、SSLを使うかどうかをハッシュで渡します。

require 'waz-storage'
require 'waz-tables'

wazopt = { :account_name => 'accounttilfin',
           :access_key => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==',
           :use_ssl => true }
WAZ::Storage::Base.establish_connection!(wazopt)

テーブルサービスの操作

テーブルの全てのエンティティを取得

エンティティを取り出します。サービスインスタンスにテーブル名を指定して query メソッドを呼ぶだけです。

service = WAZ::Tables::Table.service_instance
entities = @service.query("<テーブル>")

これでハッシュの配列でエンティティ群が取得できます。
ただ一度に取れるのは、1000件までです。continuation_token に続きのPartitionKeyとRowKeyが入っています。これを query メソッドのオプションに渡します。

if entities.continuation_token["NextPartitionKey"].nil?
  next_entities = service.query("<テーブル>",
               { :continuation_token => entities.continuation_token })
end
パーティション内のエンティティを取得

query オプションに expression を指定できるのでここでフィルタで定義します。

partition_key = "<PartitionKey>"
entities = service.query("<テーブル>",
        { :expression => "PartitionKey eq #{partition_key}" })

テーブル デザイナー用のフィルター文字列の作成

エンティティの取得

特定の Row だけ取得します。

entity = service.get_entity("<テーブル>", "<PartitionKey>", "<RowKey>")
エンティティの追加・更新

追加は insert_enity, 置き換え更新は update_enity, マージ更新は merge_enity になります。

entity = { :name => "なまえ", :age => 25 }
entity[:partition_key] = "<PartitionKey>"
entity[:row_key] = "<RowKey>"
entity[:Timestamp] = Time.now.utc

service.insert_entity("<テーブル>", entity)

upsert をやりたい場合は、REST API の 2011-08-18 バージョンから追加するもしくはマージ更新という仕様に変わっています。そこでライブラリに下記のように mix-in を使うことで upsert_entity を実装できます。

module WAZTablesTableExtends
  def upsert_entity(table_name, entity)
    raise WAZ::Tables::InvalidTableName, table_name unless WAZ::Storage::ValidationRules.valid_table_name?(table_name)
    response = execute(:merge, "#{table_name}(PartitionKey='#{entity[:partition_key]}',RowKey='#{entity[:row_key]}')",
        {}, 
        default_headers.merge({'x-ms-version' => '2011-08-18'}),
        generate_payload(table_name, entity))
    return parse_response(response)
  end
end

class WAZ::Tables::Service
  include WAZTablesTableExtends
end
エンティティの削除

削除は delete_entity を呼び出します。

service.delete_entity("<テーブル>", "<PartitionKey>", "<RowKey>")