データストアとアプリのバージョンは GAE/J でどのように機能しますか
-
20-08-2019 - |
質問
同じアプリケーションの複数のバージョンを GAE/J にデプロイできますが、バージョンが異なると異なるデータストア (おそらく互換性がない) スキームを使用できるという事実に GAE/J はどのように対処するのでしょうか?
例:
私のアプリケーションのバージョン 1 に次のような POJO があるとします (わかりやすくするためにいくつかの詳細は省略しています)。
public class User {
private String key;
private String username;
private Integer phoneNumber;
}
ここで、バージョン 2 で次のように使用するとします。
public class User {
private String key;
private String username;
// on this version, replaced 'phoneNumber' by:
private String eMail;
}
ここで 2 つの質問があります:
GAE/J の両方のバージョンをデプロイした場合、データストアにはどのようなスキーマが表示されますか?
データ自体はどうなるのでしょうか?バージョン 2 でユーザーを追加した場合、そのデータはバージョン 1 のデータストアに表示されますか?
解決
ドキュメントを引用、
リレーショナルデータベースとは異なり、アプリケーション エンジンのデータストアはそれを必要としません。 特定の種類のすべてのエンティティを持っています 同じ性質。アプリケーションことができます そのデータモデルを指定し、施行 使用するライブラリは、SDKに含まれ、 または独自のコードます。
これはまた、「ソフトスキーマ」と呼ばれている - データストアは本当にをしないあなたの(のスキーマんが、多かれ少なかれ、アプリケーションレベルのコードを経由してスキーマのいくつかのソフトの種類をシミュレートすることができます、または)ライブラリに所有しています。
あなた(ライブラリを経由したり、独自のコードでは)「この属性が存在しなければなりません」と言う制約を強制するのであれば、それは異なるに基づいて、挿入されたため、特定のエンティティは、実際には「(その属性を持っていません例えばソフトスキーマ」、アプリの異なるバージョン)、そして、あなたはあなたのアプリケーションレベルのコードやライブラリは制約がチェックされている時点で、このソフト制約の違反を示すために使用することを選択したものは何でも例外取得します。
あなたはそのような制約を表現しない場合は、、その後、行方不明の属性は、あなたのコードやライブラリによって提供されたデフォルト値、または他の私は通常、PythonでJavaまたはnull
にNone
されると信じて、「デフォルトのデフォルト」を、持っていますどちらか。
アプリケーションの異なるバージョンが異なるランタイムを使用してもよいことに留意されたい(一部は、Javaであってもよく、他は、Pythonであってもよい)と異なるランタイムはまだは同じデータストアを使用するため、JavaのPythonの対区別がありますここでは重要ではない。
あなたの具体的な例では、私はどちらかのバージョンからユーザーを追加することがnull
と見られて行方不明の属性で、他からそれが見えるようになります(ただし、制約があるかもしれないことを期待する(提供なしデフォルトと必須の存在について行わなしアサーションと)私は認識していないんだという、ライブラリはこれらの制約を検証しようと、彼らが侵害されている見ているときに例外が)生じるはずである。その場合にはています。
一般的に、私は「オプション」を追加することを心配しないだろう、(合法的に不足している/ null
/ None
こと、またはこれらの例では、明示的なデフォルトを有していても良いものを属性)が、変更の他の種類(製造多分セキュアデータコネクタを介して「データベースの移行」()または「レガシー互換性のためのアプリケーションレベルのハックの形態を必要とするかもしれない)は、以前に存在しないか、またはオプションの属性は等、他の制約を加える代わりに必須です「移行は単に実行不可能である場合。
の移行は、特に、実現可能ではないかもしれないが、例えば、制約を削除すると、古いことから、それらを追加することと同じように問題になりますバージョンは)新しいバージョンでは削除されている制約に違反する新しい1に入力されたデータを扱うことができないことがあります。
これは実際には必ずしも簡単な問題ではないが、それはまだそれをこのように考えるのに役立ちますので:データストア自体何のスキーマを持っていない、唯一の私のアプリおよび/またはそれがで望まれているものは何でも制約強制使用することを選択したライブラリ、それ自体が根本的エンティティに関するアプリケーションレベル、それぞれが本当に任意の属性を設定している - 「ソフトスキーマ」、アプリケーションレベルのスキーマ、基礎となるデータ層でない「実際の」スキーマを