エンティティの作成、取得、更新、削除

Google Cloud Datastore 内のデータ オブジェクトは「エンティティ」と呼ばれ、個々のエンティティはクエリのために特定の「種類」で分類されます。たとえば、人事アプリケーションを作成している場合は、Employee という種類のエンティティを使用して各従業員を表現できます。エンティティ データ値は、プロパティの形で表されます。エンティティの詳細については、祖先パスおよびトランザクションに関するドキュメントをご覧ください。

エンティティの作成とプロパティの設定

エンティティを作成して設定するには、そのモデルクラスのコンストラクタ メソッドを呼び出します。エンティティ モデルクラスの作成方法については、エンティティ モデルクラスの作成と使用をご覧ください。

次の例は、キーワード引数を使用してモデルクラス コンストラクタを呼び出す方法を示しています。

sandy = Account(
    username='Sandy', userid=123, email='sandy@example.com')

このコードは、プログラムのメインメモリでオブジェクトを作成します。ただし、プロセスが終了するとエンティティが消滅するため、エンティティを Cloud Datastore で保持するために次のように put() を呼び出す必要もあることに注意してください。

sandy_key = sandy.put()

このコードは、後で Cloud Datastore からエンティティを取得するために使用できるキーを返します。

次のオプションのいずれかを使用してプロパティを設定します。

ただし、エンティティのプロパティとプロパティ型 (この場合は StringPropertyIntegerProperty) を設定し、型チェックを実行するように選択します。

次に例を示します。

bad = Account(
    username='Sandy', userid='not integer')  # raises an exception
...
sandy.username = 42  # raises an exception

キーからエンティティを取得する

エンティティのキーを持っている場合は、Cloud Datastore からエンティティを取得できます。

sandy = sandy_key.get()

キーメソッドの kind()id() は、キーからエンティティの種類と識別子を回復します。

kind_string = sandy_key.kind()  # returns 'Account'
ident = sandy_key.id()  # returns '2'

エンティティのキーを使用して、URL への埋め込みに適したエンコード文字列を取得することもできます。

url_string = sandy_key.urlsafe()

このコードは、後でキーを再構築して元のエンティティを取得するために使用可能な agVoZWxsb3IPCxIHQWNjb3VudBiZiwIM のような結果を生成します。

sandy_key = ndb.Key(urlsafe=url_string)
sandy = sandy_key.get()

URL セーフ文字列は暗号のように見えますが、暗号化されているわけではないことに注意してください。簡単にデコードして、元のエンティティの種類と識別子を復元できます。

key = Key(urlsafe=url_string)
kind_string = key.kind()
ident = key.id()

このような URL セーフキーを使用する場合、メールアドレスなどの機密データはエンティティ識別子として使用しないでください。この解決策として、機密データのハッシュを識別子として使用する方法があります。このようにすると、暗号化されたキーを入手した第三者がそれを利用してメールアドレスを収集することはできなくなります。ただし、第三者が既知のメールアドレスを使って自分でハッシュを生成し、そのアドレスが Cloud Datastore 内に存在するかどうかを確認することは可能ですので、ご注意ください。

エンティティの更新

既存のエンティティを更新するには、それを Cloud Datastore から取得し、そのプロパティを変更して元の場所に戻します。

sandy = key.get()
sandy.email = 'sandy@example.co.uk'
sandy.put()

この場合は、エンティティを更新しても、エンティティ キーは変更されないため、put() から返される値を無視できます。

エンティティの削除

不要になったエンティティは、キーの delete() メソッドを使用して Cloud Datastore から削除できます。

sandy.key.delete()

これはキーに対する操作であり、エンティティ自体に対する操作ではないことに注意してください。常に None が返されます。

エンティティの一括削除

多数のエンティティを削除する必要がある場合は、Cloud Dataflow を使用してエンティティを一括削除することをおすすめします。

一括処理の使用

エンティティまたはキーのまとまりをループ内部のような複数回の呼び出しではなく、1 回の呼び出しで処理できます。これにより、エンティティごとに別個のリモート プロシージャ コール(RPC)を呼び出すのではなく、一括処理用の RPC を 1 回呼び出すだけで処理することができます。

コード例を以下に示します。

list_of_keys = ndb.put_multi(list_of_entities)
list_of_entities = ndb.get_multi(list_of_keys)
ndb.delete_multi(list_of_keys)

上記のコードでは、キー オブジェクトのリストを ndb.get_multi に渡して、バッチ内の複数のエンティティを取得します。ndb.get_multi は、エンティティ オブジェクトのリストを返します。Cloud Datastore 内に対応するエンティティがないキーの値は None です。この方法でエンティティを取得すると、バッチ全体の Cloud Datastore への呼び出しが少なくなります(バッチあたりの呼び出しの数はバッチサイズ設定によって異なります)。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Python 2 の App Engine スタンダード環境