儲存資料

Cloud Datastore 是專為自動調整資源配置、高效能,以及協助應用程式開發所打造的非關聯 (NoSQL) 資料庫,您可以將使用者上傳的內容儲存在這個資料庫中。

本頁與範例是簡易網誌應用程式之延伸學習範例的一部分,此網誌應用程式可讓使用者上傳貼文。您應該已經熟悉 Go 程式設計語言和基本的網路開發。如要從頭開始,請前往透過 Go 建構應用程式

費用

執行本教學課程不會產生相關費用。執行這個範例應用程式也不會超過您的免費配額

事前準備

如果您已經從透過 Go 建構應用程式開始,請跳過本節。如否,請完成下列步驟:

  1. 完成設定您的專案和應用程式中的事前準備工作。

  2. 在本範例中,請將程式碼新增至 gophers-3 範例,也就是從處理 HTML 表單資料中產生的最終成果。

    下載 gophers-3 範例及其相依項到您的本機電腦:

    go get -u -d github.com/GoogleCloudPlatform/golang-samples/appengine/gophers/gophers-3/...
    
  3. 切換至 gophers-3 目錄:

    cd $GOPATH/src/github.com/GoogleCloudPlatform/golang-samples/appengine/gophers/gophers-3
    

結構化您的應用程式

本範例專案的結構如下:

  • go-app/:專案根目錄。

    • app.yaml:App Engine 應用程式的配置設定。
    • main.go:應用程式的程式碼。
    • index.html:用以顯示您首頁的 HTML 範本。
    • static/:儲存靜態檔案的目錄。
      • style.css:用以設定 HTML 檔案外觀格式的樣式表。
      • gcp-gopher.svg:Gopher 圖片。

建立及提交貼文

將每個使用者提交的貼文分為三個欄位:作者的名稱、訊息內容,以及使用者張貼訊息的日期和時間。

  1. 將下列套件新增至 main.go 檔案的 imports 清單中:

    "time"
    
    "google.golang.org/appengine/datastore"
    "google.golang.org/appengine/log"

  2. 將每個使用者提交的貼文定義為含有這三個欄位的資料結構:AuthorMessagePosted

    type Post struct {
    	Author  string
    	Message string
    	Posted  time.Time
    }
    

  3. 將下列欄位新增至 templateParams 資料結構以更新動態 HTML 檔案。

    Message string
    
    Posts []Post

  4. 當使用者提交表單且系統做出 POST 要求時,請將使用者提交的表單值歸類到 Post 資料結構,來處理提交的表單:

    post := Post{
    	Author:  r.FormValue("name"),
    	Message: r.FormValue("message"),
    	Posted:  time.Now(),
    }

儲存貼文到 Cloud Datastore

使用 datastore.Put 函式,將新的值 (也稱為實體) 儲存到 Cloud Datastore。

  1. indexHandler 函式中新增新內容,以便將特定要求的所有相關操作連結在一起:

    ctx := appengine.NewContext(r)

    appengine.NewContext 函式會傳回與目前要求關聯的 context.Context 值,這是一個不透明值,在 Go App Engine SDK 中很多函式都使用這個值與 App Engine 服務通訊。

  2. Cloud Datastore 中的金鑰為獨一無二、由系統自動產生的 ID。其中有指向實體的完整金鑰,而指向實體的不完整金鑰則尚未儲存在 Cloud Datastore 中。建立金鑰時,必須指定種類。實體具有特定種類,這與關聯資料庫中資料列屬於特定資料表的情況類似。更多資訊請參閱實體、屬性和金鑰

    請在 indexHandler 函式中建立 Post 種類的金鑰:

    key := datastore.NewIncompleteKey(ctx, "Post", nil)

    NewIncompleteKey 函式中的最後一個參數是 *datastore.Key,這個參數會指向您正在建立之金鑰的父項。目前,此參數值始終為 nil

  3. 使用 datastore.Put 函式,將 post 實體儲存在 Cloud Datastore 中:

    if _, err := datastore.Put(ctx, key, &post); err != nil {
    	log.Errorf(ctx, "datastore.Put: %v", err)
    
    	w.WriteHeader(http.StatusInternalServerError)
    	params.Notice = "Couldn't add new post. Try again?"
    	params.Message = post.Message // Preserve their message so they can try again.
    	indexTemplate.Execute(w, params)
    	return
    }

    if 陳述式會以記錄錯誤、傳送錯誤碼,然後在 index.html 中更新通知的方式來處理錯誤。

  4. 前置剛剛上傳至 templateParams{}Posts[] 陣列的貼文:

    params.Posts = append([]Post{post}, params.Posts...)

從 Cloud Datastore 擷取貼文

查詢 Cloud Datastore 並對結果進行反覆處理。

  1. indexHandler 函式中建構 Query 值,以依 Posted 遞減順序來要求最近的 20 個 Post 物件。

    q := datastore.NewQuery("Post").Order("-Posted").Limit(20)

    如需進一步瞭解查詢,請參閱 Cloud Datastore 查詢

  2. 擷取結果,方法為執行 Query 並使用 GetAll 方法來附加符合 params.Posts 的結果:

    if _, err := q.GetAll(ctx, &params.Posts); err != nil {
    	log.Errorf(ctx, "Getting posts: %v", err)
    	w.WriteHeader(http.StatusInternalServerError)
    	params.Notice = "Couldn't get latest posts. Refresh?"
    	indexTemplate.Execute(w, params)
    	return
    }

在您的 HTML 範本中顯示貼文

index.html 的表單底下,新增下列幾行內容以更新範本,使其包含提交的貼文:

{{with .Posts}}
<ol>
  {{range .}}
  <li><cite>{{.Author}}</cite><p>{{.Message}}</p></li>
  {{end}}
</ol>
{{end}}

在本機執行您的應用程式

使用 Cloud SDK 隨附的本機開發伺服器 (dev_appserver.py),執行並測試您的應用程式。

  1. 從應用程式 app.yaml 所在的專案根目錄中,使用下列指令啟動本機開發伺服器:

    dev_appserver.py app.yaml
    

    本機開發伺服器現已開始執行並監聽 8080 連接埠的要求。發生問題了嗎?

  2. 使用網路瀏覽器前往 http://localhost:8080/ 查看應用程式。

    最終

執行本機開發伺服器 (dev_appserver.py)

如要執行本機開發伺服器,您可以指定完整的目錄路徑來執行 dev_appserver.py,或是將 dev_appserver.py 新增至 PATH 環境變數:

  • 如果您安裝了原始 App Engine SDK,該工具位於以下路徑:

    [PATH_TO_APP_ENGINE_SDK]/dev_appserver.py
    
  • 如果您安裝了 Google Cloud SDK,該工具位於以下路徑:

    [PATH_TO_CLOUD_SDK]/google-cloud-sdk/bin/dev_appserver.py
    

    提示:如要將 Google Cloud SDK 工具新增至您的 PATH 環境變數,並在殼層中啟用 command-completion,您可以執行以下指令:

    [PATH_TO_CLOUD_SDK]/google-cloud-sdk/install.sh
    

如要進一步瞭解如何執行本機開發伺服器 (包括如何變更通訊埠編號),請參閱本機開發伺服器參考資料。

變更程式碼

本機開發伺服器會監看專案檔案的變更,所以會在您變更程式碼之後,重新編譯並重新啟動您的應用程式。

  1. 立即嘗試:讓本機開發伺服器維持執行的狀態,然後試著編輯 index.html,將「The Gopher Network」改成其他內容。

  2. 重新載入 http://localhost:8080/,查看您變更的內容。

部署您的應用程式

使用下列指令,從 app.yaml 所在的專案根目錄,將您的應用程式部署至 App Engine:

gcloud app deploy

查看應用程式

如要啟動瀏覽器並前往 http://[YOUR_PROJECT_ID].appspot.com 查看您的應用程式,請執行下列指令:

gcloud app browse

後續步驟

恭喜!您已建構好一個應用程式,可在 Cloud Datastore 中儲存並擷取資料。

接下來,請瞭解如何使用 Firebase 驗證來驗證您的應用程式使用者。

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

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

這個網頁
Go 適用的 App Engine 標準環境