使用 Cloud Datastore

您可以使用 Google Cloud Datastore 儲存來自 App Engine 應用程式的資料。Cloud Datastore 是為了協助應用程式開發作業打造的資料庫,能夠自動調整資源配置並具有卓越效能。

本文件說明如何透過 App Engine 應用程式中的 Cloud Datastore,使用 Google Cloud 用戶端程式庫儲存和擷取資料。

必備條件和設定

請按照 App Engine 上 Go 適用的「Hello, World!」操作說明來設定您的環境和專案,並瞭解如何在 App Engine 中建構 Go 應用程式。請記下並儲存您的專案 ID,因為您需要這些資訊才能執行本文說明的範例應用程式。

複製存放區

下載 (複製) 此範例:

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

編輯專案設定並設定相依項目

app.yaml,為您的專案設定 GCLOUD_DATASET_ID。這項設定值就是您的專案 ID。

# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

runtime: go
env: flex

automatic_scaling:
  min_num_instances: 1

env_variables:
  GCLOUD_DATASET_ID: your-project-id

應用程式碼

範例應用程式會記錄、擷取及顯示訪客 IP。您可以看到記錄項目是簡易的兩欄類別,其中註明類型 visit,並使用 Datastore 用戶端的 put 指令將資料儲存於 Cloud Datastore 中。然後,系統會使用 Datastore 用戶端的 NewQueryGetAll 指令,以遞減順序擷取最近的十筆造訪記錄。


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

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

	"cloud.google.com/go/datastore"
	"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 查詢作業須使用一或多個索引,因此您必須在 index.yaml 檔案中指定這些索引,再與應用程式一併上傳。這個檔案可透過手動方式建立,或是在本機環境中測試應用程式時自動產生。

本機測試

如果需要在本機環境中開發及測試您的應用程式,可以使用 Cloud Datastore 模擬器

瞭解詳情

如需 Cloud Datastore 的完整資訊,包括最佳化與相關概念,請參閱 Cloud Datastore 說明文件

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Go 適用的 App Engine 彈性環境