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

Datastore のデータ オブジェクトはエンティティと呼ばれ、個々のエンティティはクエリの目的で特定の種類に分類されます。たとえば、人事アプリケーションを作成する場合、各従業員を Employee という種類のエンティティで表すことができます。エンティティ データ値は、プロパティの形で表されます。エンティティの詳細については、エンティティ、プロパティ、キーを参照してください。

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

Go で新しいエンティティを作成するには、Go 構造体のインスタンスを作成し、そのフィールドに値を設定したうえで、datastore.Put を呼び出して Datastore に保存します。Datastore にはエクスポートされたフィールド(大文字で始まるもの)のみが保存されます。エンティティのキー名を指定するには、空でない stringID 引数を datastore.NewKey に渡します。

次の例では、種類が Employee のエンティティを作成し、そのプロパティ値を設定して、Datastore に保存します。

import (
	"time"

	"golang.org/x/net/context"

	"google.golang.org/appengine/datastore"
)

type Employee struct {
	FirstName          string
	LastName           string
	HireDate           time.Time
	AttendedHRTraining bool
}

func f(ctx context.Context) {
	// ...
	employee := &Employee{
		FirstName: "Antonio",
		LastName:  "Salieri",
		HireDate:  time.Now(),
	}
	employee.AttendedHRTraining = true

	key := datastore.NewIncompleteKey(ctx, "Employee", nil)
	if _, err := datastore.Put(ctx, key, employee); err != nil {
		// Handle err
	}
	// ...
}

Employee 型は、データモデルに FirstNameLastNameHireDateAttendedHRTraining の 4 つのフィールドを宣言します。

空のキー名を指定するか、datastore.NewIncompleteKey を使用すると、Datastore によって数値 ID がエンティティのキーとして自動的に生成されます。

employee := &Employee{
	FirstName: "Antonio",
	LastName:  "Salieri",
	HireDate:  time.Now(),
}
employee.AttendedHRTraining = true
key := datastore.NewIncompleteKey(ctx, "Employee", nil)
_, err = datastore.Put(ctx, key, employee)

エンティティの取得

指定したキーで識別されるエンティティを取得するには、*datastore.Key を引数として datastore.Get 関数に渡します。datastore.NewKey を生成するには、*datastore.Key 関数を使用します。

employeeKey := datastore.NewKey(ctx, "Employee", "asalieri", 0, nil)
addressKey := datastore.NewKey(ctx, "Address", "", 1, employeeKey)
var addr Address
err = datastore.Get(ctx, addressKey, &addr)

datastore.Get は適切な Go 構造体のインスタンスを設定します。

エンティティの更新

既存のエンティティを更新するには、構造体の属性を変更してから datastore.Put を呼び出します。このデータで既存のエンティティが上書きされます。datastore.Put を呼び出すたびに、オブジェクト全体が Datastore に送信されます。

エンティティの削除

エンティティを削除するには、エンティティのキーを指定して、datastore.Delete 関数を実行します。

key := datastore.NewKey(ctx, "Employee", "asalieri", 0, nil)
err = datastore.Delete(ctx, key)

エンティティの一括削除

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

バッチ オペレーションの使用

1 回の Datastore 呼び出しで複数のエンティティを処理する場合は、次のバッチ オペレーションを使用できます。

バッチ呼び出しの例を次に示します。

// A batch put.
_, err = datastore.PutMulti(ctx, []*datastore.Key{k1, k2, k3}, []interface{}{e1, e2, e3})

// A batch get.
var entities = make([]*T, 3)
err = datastore.GetMulti(ctx, []*datastore.Key{k1, k2, k3}, entities)

// A batch delete.
err = datastore.DeleteMulti(ctx, []*datastore.Key{k1, k2, k3})

バッチ オペレーションを実行してもコストは変わりません。キーが存在するかどうかにかかわらず、バッチ オペレーションに含まれるすべてのキーについて課金されます。オペレーションに含まれるエンティティのサイズは、コストに影響しません。