こんばんは、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シリーズつづく(か?)