0

python appengineでは、ポリモデルクラスを持っています(例えばAnimal)。データストアに子クラスのインスタンスをいくつか格納しました(例:Horse)。python appengineのポリモデルの子クラスを削除する

私はPythonのソースコード内のHorseクラスの定義を削除(または名前を変更)、およびdb.getとエンティティのキ​​ーを使用して格納Horseエンティティを取得した場合、何が起こるのだろうか?

検索されたエンティティはタイプAnimalであるか? PolyModel?例外はありますか?

+0

ダンの答えはスポット上にあります。 db libを経由して基礎となるエンティティをフェッチすることができます。エンティティを移行して(フェッチ、プット)、新しいモデルを反映するようにエンティティを調整することができます。 –

答えて

2

データストア自体は実際にはPythonクラスやデータモデルそのものを知らない/気にしませんが、これは実際にはGAE dbまたはndbクライアントライブラリに固有の実装の詳細です。あなたは(モデル定義せずに、一般的なPythonクライアントライブラリを使用しています)Creating an entity例ではそれを見ることができます - エンティティデータは、名前と値のペアを辞書に簡単です:

task = datastore.Entity(client.key('Task')) 
task.update({ 
    'category': 'Personal', 
    'done': False, 
    'priority': 4, 
    'description': 'Learn Cloud Datastore' 
}) 

でエンティティモデルを削除/名前変更しますアプリケーションはデータストア内のエンティティを削除しませんが、データストアブラウザでエンティティを確認することはできます。

すでに作成されたエンティティのキ​​ーには、エンティティ種類(文字列として)が埋め込まれています。それは輸入モデルに対してデータストアから返されたデータのチェックを行うためKindError例外が発生しますその保存されたキーにdb.get()を実行しようとすると:あなたがあなたのモデルのリワークを実行したいのであれば

Traceback (most recent call last): 
    File "/usr/local/google_appengine/google/appengine/tools/devappserver2/python/request_handler.py", line 226, in handle_interactive_request 
    exec(compiled_code, self._command_globals) 
    File "<string>", line 12, in <module> 
    File "/usr/local/google_appengine/google/appengine/ext/db/__init__.py", line 1540, in get 
    return get_async(keys, **kwargs).get_result() 
    File "/usr/local/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 613, in get_result 
    return self.__get_result_hook(self) 
    File "/usr/local/google_appengine/google/appengine/datastore/datastore_rpc.py", line 1715, in __get_hook 
    entities = extra_hook(entities) 
    File "/usr/local/google_appengine/google/appengine/api/datastore.py", line 643, in local_extra_hook 
    return extra_hook(result) 
    File "/usr/local/google_appengine/google/appengine/ext/db/__init__.py", line 1509, in extra_hook 
    cls1 = class_for_kind(entity.kind()) 
    File "/usr/local/google_appengine/google/appengine/ext/db/__init__.py", line 299, in class_for_kind 
    raise KindError('No implementation for kind \'%s\'' % kind) 
KindError: No implementation for kind 'Horse' 

をし、既に保存されているデータを再利用してください。古いモデルを保存しておき、新しいモデルでデータを読み込んで書き戻す必要があります。

+0

継承チェーンA-> B-> Cがあり、データストアにCを保存してから、コードをA-> Cに変更するとどうなりますか。それは例外を提起するだろうか? (データストアが完全な継承チェーンを認識しているのが分かります) – Uri

+0

継承の変更が実体モデルの変更に効果的に変換された場合、その答えが適用されます。データストアエンティティの祖先パスも変更された場合は、それらのエンティティも書き直す必要があります。エンティティが保存されると、祖先は変更できません。エンティティキーに埋め込まれます。継承の変更がモデルやエンティティの祖先に影響を与えない場合、継承は透過的でなければなりません(まだキーを取得できると仮定します)。 Pythonクラス継承をデータストアエンティティの祖先と混同しないでください。 –

関連する問題