Cloud Datastore の使用

Google Cloud Datastore を使用して、App Engine アプリからのアプリケーション データを保存できます。Cloud Datastore は、自動スケーリングと高いパフォーマンスを実現し、アプリケーション開発を簡素化するように構築されたデータベースです。

このドキュメントでは、Google Cloud クライアント ライブラリを使用し、App Engine アプリから Cloud Datastore にアクセスしてデータの保存と取得を行う方法を説明します。

前提条件と設定

App Engine の Go 用「Hello, World!」の説明に従って環境とプロジェクトを設定し、App Engine での Go アプリの構造を理解してください。このドキュメントで説明しているサンプルアプリを実行する際に必要となるため、プロジェクト ID をメモして保存しておきます。

レポジトリのクローン作成

サンプルをダウンロード(クローニング)します。

go get -u -d github.com/GoogleCloudPlatform/golang-samples/appengine_flexible/datastore
cd $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples/appengine_flexible/datastore

プロジェクト構成の編集と依存関係の設定

app.yaml で、プロジェクトの GCLOUD_DATASET_ID を設定します。この値はプロジェクト ID です。

runtime: go
env: flex

automatic_scaling:
  min_num_instances: 1

env_variables:
  GCLOUD_DATASET_ID: your-project-id

アプリケーション コード

このサンプル アプリケーションは訪問者の IP のログ記録、取得、および表示を行います。ログエントリはタイプ visit の単純な 2 フィールド クラスであり、Datastore クライアントの put コマンドを使用して Cloud Datastore に保存されることがわかります。次に、Datastore クライアントの NewQuery および GetAll コマンドを使用して、最新の 10 件の訪問を降順に取得します。

// Copyright 2015 Google Inc. All rights reserved.
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.

// Sample datastore demonstrates use of the cloud.google.com/go/datastore package from App Engine flexible.
package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
	"time"

	"cloud.google.com/go/datastore"

	"golang.org/x/net/context"

	"google.golang.org/appengine"
)

var datastoreClient *datastore.Client

func main() {
	ctx := context.Background()

	// Set this in app.yaml when running in production.
	projectID := os.Getenv("GCLOUD_DATASET_ID")

	var err error
	datastoreClient, err = datastore.NewClient(ctx, projectID)
	if err != nil {
		log.Fatal(err)
	}

	http.HandleFunc("/", handle)
	appengine.Main()
}

func handle(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path != "/" {
		http.NotFound(w, r)
		return
	}

	ctx := context.Background()

	// Get a list of the most recent visits.
	visits, err := queryVisits(ctx, 10)
	if err != nil {
		msg := fmt.Sprintf("Could not get recent visits: %v", err)
		http.Error(w, msg, http.StatusInternalServerError)
		return
	}

	// Record this visit.
	if err := recordVisit(ctx, time.Now(), r.RemoteAddr); err != nil {
		msg := fmt.Sprintf("Could not save visit: %v", err)
		http.Error(w, msg, http.StatusInternalServerError)
		return
	}

	fmt.Fprintln(w, "Previous visits:")
	for _, v := range visits {
		fmt.Fprintf(w, "[%s] %s\n", v.Timestamp, v.UserIP)
	}
	fmt.Fprintln(w, "\nSuccessfully stored an entry of the current request.")
}

type visit struct {
	Timestamp time.Time
	UserIP    string
}

func recordVisit(ctx context.Context, now time.Time, userIP string) error {
	v := &visit{
		Timestamp: now,
		UserIP:    userIP,
	}

	k := datastore.IncompleteKey("Visit", nil)

	_, err := datastoreClient.Put(ctx, k, v)
	return err
}

func queryVisits(ctx context.Context, limit int64) ([]*visit, error) {
	// Print out previous visits.
	q := datastore.NewQuery("Visit").
		Order("-Timestamp").
		Limit(10)

	visits := make([]*visit, 0)
	_, err := datastoreClient.GetAll(ctx, q, &visits)
	return visits, err
}

index.yaml ファイルの使用

このサンプルアプリは簡単なクエリを実行しています。より複雑な Datastore クエリには、1 つ以上のインデックスが必要になります。これらのインデックスは、アプリとともにアップロードする index.yaml ファイルで指定する必要があります。このファイルは手動で作成することも、アプリをローカルでテストするとき自動的に生成することもできます。

詳細情報

Cloud Datastore の最適化やコンセプトなどの詳細については、Cloud Datastore のドキュメントをご覧ください。

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

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

Go の App Engine フレキシブル環境