データの保存

Cloud Datastore に、ユーザーがアップロードしたコンテンツを保存します。Cloud Datastore は自動スケーリングと高パフォーマンスを実現し、アプリケーション開発を簡易化するために構築された非リレーショナル(NoSQL)データベースです。

このページとサンプルは、ユーザーが投稿をアップロードできる簡単なブログ アプリケーションの学習用サンプルを拡張したものの一部です。Go プログラミング言語と基本的なウェブ開発に精通している方を対象として説明します。最初から開始するには、Go を使用したアプリのビルドをご覧ください。

料金

このチュートリアルの実行に伴う費用はありません。このサンプルアプリを実行するだけであれば、無料の割り当てを超過することはありません。

始める前に

Go を使用したアプリのビルドから開始した場合、このセクションはスキップしてください。それ以外の場合は、次の手順を実行します。

  1. プロジェクトとアプリケーションの設定の「始める前に」に記載されている作業を実行します。

  2. この例では、HTML フォームデータの処理の最終成果物である gophers-3 サンプルにコードを追加します。

    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 イメージ。

投稿の作成と保存

ユーザーが送信した投稿を作成者の名前、メッセージの内容、ユーザーがメッセージを投稿した日時の 3 つのフィールドに分類します。

  1. main.go ファイルのインポート リストに次のパッケージを追加します。

    "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 に投稿を保存する

新しい値(エンティティともいいます)を Cloud Datastore に保存するには、datastore.Put 関数を使用します。

  1. indexHandler 関数に新しいコンテキストを追加して、特定のリクエストに関連するすべての操作をまとめてリンクします。

    ctx := appengine.NewContext(r)

    appengine.NewContext 関数は、現在のリクエストに関連する context.Context 値を返します。Go App Engine SDK の多くの関数が、この不透明な値を使用して App Engine サービスと通信を行います。

  2. Cloud Datastore では、キーは自動的に生成される一意の識別子です。1 つのエンティティを参照する完全なキーもあれば、Cloud Datastore にまだ保存されていないエンティティを参照する不完全なキーもあります。キーを作成するときは、種類を指定する必要があります。エンティティには特定の種類があり、リレーショナル データベースの行が特定のテーブルに属しているのと似ています。詳細については、エンティティ、プロパティおよびキーをご覧ください。

    indexHandler 関数に種類が Post のキーを作成します。

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

    NewIncompleteKey 関数の最後のパラメータは *datastore.Key で、作成中のキーの親を指します。この値は常に nil になります。

  3. Cloud Datastore に post エンティティを格納します。この処理は、datastore.Put 関数で行います。

    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 関数で、最新の 20 個の Post オブジェクトを Posted の降順でリクエストする Query 値を作成します。

    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 を実行するか、PATH 環境変数に dev_appserver.py を追加します。

  • 元の 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 環境変数に追加し、シェルでコマンドの補完を有効にするには、次のコマンドを実行します。

    [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 Authentication を使用して、アプリケーションに対しユーザーを認証する方法を学びます。

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

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

Go の App Engine スタンダード環境