Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

Tableの作成

こんばんは、statemachineです。Live Writerとかで、はてなダイアリーは更新できないんでしょうか。ちっとしらべると画像のUploadはダメっぽそうですね。なんとなくはてな記法にもなれたような、なれないような。


さて、Tableについてのネタを書いてこなかったようなんですが、勉強をかねて書いていこうかなと思っています。が、いまさらここで、Table云々は語るつもりはあんまりなくて、いつものようにコードベースで話を進めていきたいです。

Table/Entityの定義

Windows Azure StorageのTableにはいわゆるスキーマがないので、適当にクラスを作ればOKです。
以下は、TableServiceEntity クラスを継承した例。必須プロパティである、PartitionKey/RowKey/Timestampは、親クラスで定義されているので、ここでは定義不要。必ずTableServiceEntityクラスを継承する必要はないのですが、これについては別途検証してみたいです。

public class SampleTable : Microsoft.WindowsAzure.StorageClient.TableServiceEntity
{
    public string FirstName { get; set;}
    public string LastName  { get; set; }    
    public int    Age       { get; set; }

    public SampleTable()
    {
    }
}

Tableの作成とデータの挿入

Tableの作成と、挿入は以下のようになります。Table名とEntityクラス名は同一にしておくと、型解決にかかる時間が少なくて済むのでパフォーマンスが劣化しません。Context.ResolveTypeを設定しておくとか他にも方法が合ったはずですが、追々ネタに追加していこうかと思ってます。

void Main()
{
   // Development fabirc account.
   // Fiddlerできるおまじない
   var account = CloudStorageAccount.Parse("UseDevelopmentStorage=true;DevelopmentStorageProxyUri=http://ipv4.fiddler");
   // Table client
   var client = account.CreateCloudTableClient();
   // Entityクラスとテーブル名は同一にしておく
   client.CreateTableIfNotExist("SampleTable");
   var context = client.GetDataServiceContext();
   
   for(int i = 1; i <= 10; i++)
   {
      // PartitionKey と RowKeyで一意とする。
      var entity = new SampleTable() 
      {
        PartitionKey = "pkey",
        RowKey = DateTime.Now.Ticks + "_"+ i,
        LastName  = "SUZUKI",
        FirstName = i + "-Rou",
        Age = 30 + i
      };
      // Tableに追加
      context.AddObject("SampleTable", entity);
      context.SaveChanges();
   }
   Console.WriteLine ("Done");
}


追加された内容は、TableExplorerなどで確認することができます。


上記の方法は、1行毎に追加して追加しているので、効率が良くありません。Fiddlerでキャプチャしたトランザクションを見てみます。Insertに10回リクエストを送っていることが確認できます。

一括して挿入する

一括して挿入するには、単純にSaveChangeをループ外にだせば....OKではありません。オプションにBatchを指定する必要があります。外に出しただけでは、10回トランザクションが走りますので、ご注意を。

   for(int i = 1; i <= 10; i++)
   {
      ...
      ...
      // Tableに追加
      context.AddObject("SampleTable", entity);
   }
   context.SaveChanges(SaveChangesOptions.Batch);

注意

すでに、いろんなところで触れられていますが、開発ファブリックでは日本語を含むデータをうまく扱えないので、注意が必要です。

説明不足なところもありますが、Tableシリーズつづく(か?)