Spanner 使用入门 (Go)

目标

本教程将介绍如何使用 Go 版 Cloud Spanner 客户端库完成以下步骤:

  • 创建 Spanner 实例和数据库。
  • 写入、读取数据库中的数据和对数据执行 SQL 查询。
  • 更新数据库架构。
  • 使用读写事务更新数据。
  • 向数据库添加二级索引。
  • 使用索引来读取数据和对数据执行 SQL 查询。
  • 使用只读事务检索数据。

费用

本教程使用 Spanner,它是Google Cloud的收费组件。如需了解使用 Spanner 的费用,请参阅价格

准备工作

完成设置中介绍的步骤,包括创建和设置默认 Google Cloud 项目、启用结算功能、启用 Cloud Spanner API 以及设置 OAuth 2.0 来获取身份验证凭据以使用 Cloud Spanner API。

尤其要确保运行 gcloud auth application-default login,以便使用身份验证凭据设置本地开发环境。

准备本地 Go 环境

  1. 如果开发机器上尚未安装 Go,请先进行安装(下载)。

  2. 如果尚未配置 GOPATH 环境变量,请按照测试安装中的说明进行配置。

  3. 将示例下载到您的机器。

    git clone https://github.com/GoogleCloudPlatform/golang-samples $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples
    
  4. 切换到包含 Spanner 示例代码的目录:

    cd $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples/spanner/spanner_snippets
    
  5. GCLOUD_PROJECT 环境变量设置为您的 Google Cloud 项目 ID:

    export GCLOUD_PROJECT=[MY_PROJECT_ID]
    

创建实例

在首次使用 Spanner 时,必须创建一个实例,实例是 Spanner 数据库使用的资源分配单位。创建实例时,请选择一个实例配置(决定数据的存储位置),同时选择要使用的节点数(决定实例中服务资源和存储资源的数量)。

如需了解如何使用以下任一方法创建 Spanner 实例,请参阅创建实例。您可以将实例命名为 test-instance,以便将其用于本文档中引用名为 test-instance 的实例的其他主题。

  • Google Cloud CLI
  • Google Cloud 控制台
  • 客户端库(C++、C#、Go、Java、Node.js、PHP、Python 或 Ruby)

浏览示例文件

示例仓库包含一个示例,展示了如何将 Spanner 与 Go 搭配使用。

请浏览 snippet.go 文件,其中说明了如何使用 Spanner。代码展示了如何创建和使用新数据库。数据使用架构和数据模型页面中显示的示例架构。

创建数据库

GoogleSQL

go run snippet.go createdatabase projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db

PostgreSQL

go run snippet.go pgcreatedatabase projects/GCLOUD_PROJECT/instances/test-instance/databases/example-db

您应该会看到:

Created database [example-db]
以下代码会创建一个数据库以及该数据库中的两个表。

GoogleSQL

import (
	"context"
	"fmt"
	"io"
	"regexp"

	database "cloud.google.com/go/spanner/admin/database/apiv1"
	adminpb "cloud.google.com/go/spanner/admin/database/apiv1/databasepb"
)

func createDatabase(ctx context.Context, w io.Writer, db string) error {
	matches := regexp.MustCompile("^(.*)/databases/(.*)$").FindStringSubmatch(db)
	if matches == nil || len(matches) != 3 {
		return fmt.Errorf("Invalid database id %s", db)
	}

	adminClient, err := database.NewDatabaseAdminClient(ctx)
	if err != nil {
		return err
	}
	defer adminClient.Close()

	op, err := adminClient.CreateDatabase(ctx