0

ここでデータ保存の GAE の例を見ていますが、これには少し戸惑いました。

def guestbook_key(guestbook_name=DEFAULT_GUESTBOOK_NAME):
    """Constructs a Datastore key for a Guestbook entity with guestbook_name."""
    return ndb.Key('Guestbook', guestbook_name)

キーが必要な理由はわかりましたが、なぜ「Guestbook」が必要なのですか? データストア内のすべての「Guestbook」オブジェクトを照会できるようにするためですか? しかし、オブジェクトのタイプをデータストアで検索する必要がある場合、query(type(Greeting) がないのはなぜですか?それが ndb.model に入れていることを考えると?

さらに、寛大に感じているのであれば、保存しているオブジェクトを作成する際に、親を設定する必要があるのはなぜですか?

greeting = Greeting(parent=guestbook_key(guestbook_name))
4

2 に答える 2

2

まず、 GAE データストアは、すべての GAE アプリで同時に使用される 1 つの大きな分散データベースです。エンティティを区別するために、GAE はシステム全体のキーを使用します。キーは次のもので構成されます。

  1. アプリケーション名 (暗黙的に設定され、API 経由では表示されません)
  2. 名前空間 APIを介して設定される名前空間(コードで設定されていない場合は、空の名前空間が使用されます)。
  3. エンティティの種類。これは単なる文字列であり、データベース レベルの型とは関係ありません。データストアはスキーマがないため、型はありません。ただし、言語ベースの API (Java JDO/JPA/objectify、Python NDB) はこれをクラス/オブジェクトにマップします。
  4. 親キー(私の知る限り、キー内でシリアル化されています)。これは、エンティティ グループを確立するために使用されます (トランザクションの範囲を定義します)。
  5. 特定のエンティティ識別子: 名前 (文字列) または ID (長い)。名前空間と種類 (および定義されている場合は親キー) 内で一意です。ID の一意性について詳しくは、こちらを参照してください。

キー内に実際に格納されているデータを確認するには、キー メソッド(java) を参照してください。

2 番目: GAE Python API では、エンティティの種類にマップするクラスを定義せずにデータストアをクエリすることはできないようです (私は GAE Python を使用していないため、間違っている可能性があります)。Java には、クラスにマッピングせずに使用できる低レベル APIがあります。

3 番目:エンティティに親を定義する必要はありません。親を定義することは、トランザクションを使用するときに重要なエンティティ グループを定義する方法です。祖先のパストランザクションを参照してください。

于 2013-06-09T19:32:29.130 に答える
2

それがキーです。種類と ID のペアで構成されるパスです。鍵は、それがどのようなものであるかを特定するものです。

2 番目の質問がわかりません。親を設定する必要はありませんが、設定する場合は、エンティティの作成時にのみ行うことができます。

于 2013-06-09T17:58:28.307 に答える