lelelemon’s blog

カメの歩みでのんびり学んでいます。

【Golang】GoでFireStoreにつないでデータを登録する

はじめに

Golang で FireStore 上にデータを登録するやり方が分からなかったので、その対応メモです。

 

事前準備

1.Firebase Project を作成する

Firebase にログインして任意のプロジェクトを作成します。

firebase.google.com その後、左メニューから「すべてのプロダクト」->「Cloud FIrestore」を選択。

画面の指示に従って、FIrestore を使用する準備を完了させます。

 

2.Firebase Admin SDK から Firestore にアクセスできるように秘密鍵を登録する

続いて、下記のサンプルコードにあるように、Firebase Admin SDK で Firestore につなげるために秘密鍵を登録していきます。

firebase.google.com

 

Google Cloud コンソールにログインして、プロジェクトは上記手順で作成したプロジェクトを選択します。

サービスアカウントページにアクセスすると、デフォルトで firebase-adminsdk のサービスアカウントが登録されていると思うので、このアカウントを選択 -> キー -> 鍵を追加 と進んで秘密鍵を作成します。
画面の指示に従って、推奨されているJSON 形式で作成するとJSONファイルがダウンロードされます。

 

実装

ここまでで事前準備が完了したので、実装を進めていきます。

firestore.go

package db

import (
	"context"
	"log"
	"os"
	"sync"

	"cloud.google.com/go/firestore"
	firebase "firebase.google.com/go"
	"google.golang.org/api/option"
)

var (
	clientInstance *firestore.Client
	clientOnce     sync.Once
	closeOnce      sync.Once
)

func InitializeFirestoreClient() {
	clientOnce.Do(func() {
		ctx := context.Background()
		sa := option.WithCredentialsFile(os.Getenv("GCLOUD_CREDENTIAL_FILE_PATH"))
		app, err := firebase.NewApp(ctx, nil, sa)
		if err != nil {
			log.Fatalf("error initilizing app: %v", err)
		}

		clientInstance, err = app.Firestore(ctx)
		if err != nil {
			log.Fatalf("error initializing Firestoer client: %v", err)
		}
	})
}

func CloseFirestoreClient() {
	closeOnce.Do(func() {
		err := clientInstance.Close()
		if err != nil {
			log.Printf("error closing Firestore client: %v", err)
		}
	})
}

// テストデータ登録
func PrepareTestData() {
	records := []struct {
		Text string
		Num  int
	}{
		{Text: "text1", Num: 1},
	}
	ctx := context.Background()
	for _, record := range records {
		_, _, err := clientInstance.Collection("records").Add(ctx, record)
		if err != nil {
			log.Printf("Failed to adding record: %v", err)
		} else {
			log.Printf("Successfully added record: %+v", record)
		}
	}
}
  • Firestore ライブラリを import し、InitializeFirestoreClient で初期化します
  • 初期化は1度だけ行えればよいので、sync.Once で行っています
  • 事前準備でダウンロードしたJSONファイルを指定して、GCLOUD_CREDENTIAL_FILE_PATH の環境変数からパスを取得して読み込んでいます。(環境変数読み込み部分のコードは後述)

 

environment.go

package configs

import (
	"log"
	"os"

	"github.com/joho/godotenv"
)

func LoadEnv() error {
	err := godotenv.Load("./configs/.env")

	if err != nil {
		log.Fatalf("error loading env file: %v", err)
		return err
	}

	gcloud_file_path := os.Getenv("GCLOUD_CREDENTIAL_FILE_PATH")
	log.Printf("GCLOUD_CREDENTIAL_FILE_PATH: %v", gcloud_file_path)

	return nil
}

 

  • 環境変数の読み込みには godotenv を使用しています

github.com

  • .env に下記のような形式で環境変数を定義します
GCLOUD_CREDENTIAL_FILE_PATH=

 

main.go

package main

import (
	"backend/configs"
	"backend/internal/db"
)

func main() {
	err := configs.LoadEnv()
	if err != nil {
		panic("error loading env file")
	}
	db.InitializeFirestoreClient()
	defer db.CloseFirestoreClient()

	db.PrepareTestData()
}
  • ここまでの処理を呼び出し、PrepareTestData 関数を呼び出して Firestore に登録を行っています

動作確認

実行前

 

main.go 実行後

 

終わりに

Firestore に接続するまでの事前準備の部分で少し手間取りましたが、シンプルな実装で Go から Firestore に接続できることがわかりました。

今回は登録だけでしたが、参照や更新、削除なども試していきたいです。