テスターですが何か?

ホビープログラマ略してHPです

AzureTableStorage(1) – とりあえず動かしてみる –

leave a comment »

前回のエントリーで宣言しましたが、Azure上で稼働していながらデータソースが自宅サーバーというなんちゃって仕様から、データソースをAzure上に移行して完全なクラウドアプリケーションにしました。データソースはAzure TableStorageを使用しています。

実際のアプリをつかっての解説は難しいので、今回のエントリーはTableStorageに対するCRUD操作を行うサンプルを作成する過程を記載します。MSDN、@ITで公開されている以下の記事をかなり参考にさせていただきました。

10 行でズバリ!! [C#] Windows Azure テーブル ストレージを利用する

Windows Azure Table – テーブル ストレージのプログラミング

 

※アプリが動くことに主眼をおいているため、テクノロジーの本質的な部分をうまく理解出来ていない可能性があります。記述が一部おかしい部分があるかもしれませんが、その点はご了承ください。プロジェクトははASP.NET MVC3アプリケーションです。

 

1.ストレージアカウントへの接続設定

WebRoleのプロパティから[設定]を選択し、[設定の追加]からストレージアカウントへの接続設定を追加します。名前に「StorageConnection」、種類に「接続文字列」、値は「…」から「Windows Azure ストレージエミュレーターの使用」を選択します。(もちろんデプロイ前にAzure上のストレージアカウントを指定するように変更します。ローカルでの開発用にエミュレーターを使用するように設定します)

image

image

この設定を読み込むコードをGlobal.asax.csのApplication_Startメソッドに記述します。その前に以下の参照を追加します。

  • Microsoft.WindowsAzure.StorageClient
  • Microsoft.WindowsAzure.ServiceRuntime

で、Application_Startメソッドは以下のようになります。

using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.ServiceRuntime;

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    // WindowsAzureストレージアカウントへの接続設定
    CloudStorageAccount.SetConfigurationSettingPublisher
       ((configName, configSettingPublisher) =>
       {
           var connectionString = RoleEnvironment.GetConfigurationSettingValue(configName);
           configSettingPublisher(connectionString);
       });
}

 

2.Modelの作成

まずは、「System.Data.Service.Client」への参照を追加します。もともとPowerSavingModelsクラスがあるので、このクラスをテーブルストレージ用のModelクラスに変更します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Services.Common;

namespace MVCApp3.Models
{
    [DataServiceKey("PartitionKey", "RowKey")]
    public class SampleModels
    {
        public string PartitionKey { get; set; }

        public string RowKey { get; set; }

        public int Key { get; set; }

        public string Value { get; set; }
    }
}

ポイントは下線をつけた以下の部分です。

  • DataServiceKeyでテーブルストレージ用のモデルと、キープロパティの指定を行います
  • テーブルストレージに必須なPartitionKeyとRowKeyプロパティを作成します(本当はTimeStampプロパティも必要みたいですが、明示的に指定しなくても暗黙的につくってくれるようです)

 

3.データアクセスクラスの作成

上記手順で作成したModelクラスを使用して、TableStorageへCRUD操作を行うクラスを作成します。LINQを利用してデータアクセスを行います、EntityFramework(LINQ to Entites)を利用したことがある人は違和感なく読み書きすることができると思います。コンストラクタでテーブルがない場合は作成しています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
using Microsoft.WindowsAzure.ServiceRuntime;

namespace MVCApp3.Models
{
    public class SampleRepository
    {
        private TableServiceContext context;

        private const string TableName = "Sample";

        public SampleRepository()
        {
            // ストレージアカウントへ接続し、クライアントを作成
            string connectionString = RoleEnvironment.GetConfigurationSettingValue("StorageConnection");
            var account = CloudStorageAccount.Parse(connectionString);
            var client = account.CreateCloudTableClient();

            context = client.GetDataServiceContext();

            // 初回アクセス時はテーブルの作成を行う
         if (!client.DoesTableExist(TableName))
         {
        client.CreateTable(TableName);
         }

        }
       
        /// <summary>
        /// 全データを取得する(Select)
        /// </summary>
        /// <returns></returns>
        public IEnumerable<SampleModels> GetData()
        {
            return context.CreateQuery<SampleModels>(TableName);
        }

        /// <summary>
        /// キーを条件にデータを取得する(Select)
        /// </summary>
        /// <param name="partitionKey"></param>
        /// <param name="rowKey"></param>
        /// <returns></returns>

        public IEnumerable<SampleModels> GetDataByKey(string partitionKey, string rowKey)
        {
            return from t in context.CreateQuery<SampleModels>(TableName)
                   where t.PartitionKey == partitionKey && t.RowKey == rowKey
                   select t;
        }

        /// <summary>
        /// キーを条件にデータを更新する(Update)
        /// </summary>
        /// <param name="partitionKey"></param>
        /// <param name="rowKey"></param>
        /// <param name="data"></param>

        public void UpdateData(string partitionKey, string rowKey, SampleModels data)
        {
            var q = from t in context.CreateQuery<SampleModels>(TableName)
                    where t.PartitionKey == partitionKey && t.RowKey == rowKey
                    select t;

            foreach (var d in q)
            {
                d.Key = data.Key;
                d.Value = data.Value;
                context.UpdateObject(d);
            }
            context.SaveChanges();
        }

        /// <summary>
        /// キーを条件にデータを削除する(Update)
        /// </summary>
        /// <param name="partitionKey"></param>
        public void DeleteData(string partitionKey, string rowKey)
        {
            var q = from t in context.CreateQuery<SampleModels>(TableName)
                    where t.PartitionKey == partitionKey && t.RowKey == rowKey
                    select t;

            foreach (var d in q)
            {
                context.DeleteObject(d);
            }
            context.SaveChanges();
        }

        /// <summary>
        /// データを登録する(insert)
        /// </summary>
        /// <param name="data"></param>

        public void InsertData(SampleModels data)
        {
            context.AddObject(TableName, data);
            context.SaveChanges();
        }

    }
}

4.Controller, Viewの作成

Index, Create, Detail, Edit, Deleteを作成します、今回のエントリーの本質的なテーマではないので割愛します。手順は以下のサイトが参考になります。

まめしば雑記 – ASP.NET MVC 3 開発入門

 

5.動作確認

Azureエミュレータでデバッグ実行し動作確認を行います。CRUD操作が行えていることが確認できると思います。

※Azureエミュレータでアプリケーションを動作させるには管理者としてVisualStudio/Visual Web Developerを起動する必要があります。

Index

image

Create

image

Detail

image

Edit

image

Delete

image

6.StorageEmulatorのデータ格納場所

ローカルのStorageEmulatorはどこにデータを格納しているのでしょうか。実はSQLServerにデータは格納されています。AzureSDKインストール時か、アプリを実行してテーブルを作成するタイミングかはわかりませんが、「DevelopmentStorageDb20090919」というデータベースが作成されています。

image

テーブルは以下のように作成されます。「TableContainer」テーブルにモデル定義が、「TableRow」テーブルにデータが格納されます。

image

TableContainerのデータの中身です、「SchemaXML」にモデル定義がXML形式で格納されています。

image

TableRowのデータの中身です。TableName, PartitionKey, RowKey, Timestampは必須の項目なのでテーブルの列として定義されていますが、データそのものはData列にXML形式で格納されています。

image

つまり、SQLServerのデータとは異なり、データの確認、検索、更新を行うことが非常に難しいです。

データを直接見るためには「Azure Storage Explorer」などサードパーティ製のツールが公開されているので、そちらを使うとデータベースのテーブルとほぼ同じ感覚でデータを参照することができます。

 

7.Azure TableStorage

次はTableStorageを本物のAzureにします、WebアプリケーションサーバーはローカルのAzureEmulatorを、TableStorageはAzurePlatform上のものを使用します。

使用するTableStorageの切り替えは、Webロールの設定の接続文字列を変更します。

image

ストレージアカウント接続文字列から「アカウント名」に自分のAzureのアカウント、「アカウントキー」にAzurePortalから確認かのうな、TableStorageのPrimary/Secondary AccessKeyのどちらかを入力します。

image

image

見た目は全く変わりませんが、先ほどローカルで確認した際に登録したデータがないとのでAzurePlarform上のTableStorageを使用していることがわかります。

image

今回のエントリーは以上です、今回作成したソースはこちらからダウンロード可能です。。次回は、Azure TableStorage上でサポートされないLINQメソッドについて解説します。

Written by david9142

2011年6月18日 @ 3:49 PM

カテゴリー: WindowsAzure

Tagged with ,

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。