创建、检索、更新和删除实体

Datastore 中的数据对象称为“实体”,其中的每个实体都会出于查询目的而归类为特定“种类”。例如,如果您要编写人力资源应用,则可以使用种类为 Employee 的实体表示每位员工。请注意,实体数据值采用属性形式。如需详细了解实体,请参阅概念文档实体、属性和键

创建实体并设置属性

在 Go 中,您可以通过以下方式创建一个新实体:构造 Go 结构体的实例,填充其字段,并调用 datastore.Put 将其保存到 Datastore。只有所导出的字段(以大写字母开头)会保存到 Datastore。您可以通过将非空 stringID 参数传递给 datastore.NewKey 来指定实体的键名。

以下示例创建种类为 Employee 的实体,填充其属性值,并将其保存到 Datastore:

import (
	"context"
	"time"

	"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

未提供键名或使用 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 批量删除实体

使用批量操作

如果要通过单个 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})

批量操作不会改变费用。无论批量操作中的每个键是否存在,您都要为各个键付费。操作所涉及的实体大小不会影响费用。