views4GCPのストレージサービスについてまとめてみた。アクセンチュアにて5年間システム開発を経験。CP300のアジア初取得者。Google基盤上でのシステム開発の普及を目標として日々活動中。TweetShareHatena注意この記事は2014年3月25日に更新されたもので、内容が古い可能性がありますのでご注意ください。GoogleAppEngine(以下GAEと呼称)に限らず、開発を行なっていると『テーブルの構造を変更しなければならない』ということが起こると思います。Datastoreの場合、単純にモデルクラスの変数の型を変更しますと、変更前後の型によってはキャストエラーが出てしまい、動かないというような事態になってしまいます。今回は弊社研究員がDatastoreモデルのEntityの構造とプロパティの変更方法と変更に伴う影響までを調べましたので発表したいと思います。今回の調査ではSlim3フレームワーク(以下Slim3と呼称)を使用しています。項目の型変更の場合(パターンは、数値⇒文字列)解決策の例Slim3におけるEntityの扱いについてDatastoreモデルのEntityが構造であるのかとSlim3ではEntityがどのように扱われるのかを見てみましょう。【注意点】この項目では、Slim3でEntityがどのように扱われているかを書いています。クラス型に変更がある場合」から読み始めてください。Datastoreでは1行分のデータを『Entity』と呼んでいます。※EntityはDatastoreのローレベルAPIで、Datastoreに保存するときの基本的な単位です。Datastoreへの保存時にEntityには一意のKeyが割り当てられています。Entityは『kind』でその種類が区別されます。RDBで言うところのテーブル名です。Entityは『property』と呼ばれる値を持つことができ、propertyは名前と値のペアで設定できます。RDBで言うところのカラムと値になります。Exampleというkind名のEntityを保存する場合は以下のようになります。DatastoreにアクセスするためのDatastoreServiceを取得します。Exampleというkindのオブジェクトを作成します。property名:versionに値:1を設定します。Datastoreに保存します。戻り値は、Entityに割り当てられた一意のKey値です。}Slim3では、POJOを「Entityにする・Entityから戻す」ということをします。これは、Metaクラスの中のentityToModelまたmodelToEntityメソッドを見てみるとよく解ると思います。※Slim3では、「@Model」でクラスをモデルとして定義すると、Metaクラスを自動生成します。MetaクラスはEntityをPOJOとして扱えるようにするためのクラスです。}のようにして、POJOをEntityに変換しています。EntityではgetProperty()・setProperty()により、Mapの様に扱うことができます。modelToEntity()では、この性質を利用してクラスのフィールド値をEntityに変換しています。このことから、DatastoreにあるEntityにはクラスの情報が保存されていないことが解ります。(ただ、Slim3だと「@Model」のkind属性がnullだった場合、kind名にクラス名があてられます。}のようにして、EntityからPOJOに変換しています。これらは全部、Slim3が裏側でやってくれていることで、プログラマーが意識する必要はありません。Slim3ではタイプなし(typeless)のEntityの読み込みも可能です。クラスとしてはTestOneが存在していなくても、下記のようにすればEntityのままDatastoreから読み出すことができます。次はDatastoreモデルの変更について、4つのパターンで説明したいと思います。モデル・Metaクラスがなくても、すでにDatastoreにあったEntityはそのままDatastoreに残っています。例:モデルクラス『ReadHistory』を削除した場合。Datastoreには残っています。新しいモデルのMetaクラスが現れます。例:モデルクラス『Option』を新規作成・追加した場合。Datastoreに追加されます。不要なら元のモデルのモデル名で残っているEntityを読み込んで、削除します。対応の必要はありません。追加されたモデル名と同じモデル名が既にあり、プロパティ名が同じで型だけが違うという場合は、キャストエラーが発生する可能性がありますので、プロパティの型変更や削除、もしくはモデルの削除が必要になります。MetaクラスのentityToModel()・modelToEntity()からその項目が消える。例:モデルクラス『Diary』のプロパティ『number』を削除した場合。MetaクラスのentityToModel()・modelToEntity()にそのプロパティが現れる。例:モデルクラス『Diary』のプロパティ『page』を追加した場合。古いモデルを新しいモデルに読み込んでも問題ありません。古いモデルを改めて保存する(上書き)まで、Datastoreには古いモデルのプロパティが残っています。例:モデルクラス『Diary』のプロパティ『number』を削除した場合。