2025年4月27日日曜日

go and firestore データ操作の成功例

https://rightcode.co.jp/blogs/8047 を参考に改変 削除は不明な点が多いのでコレクション

削除の例のみにとどめる

------------------------------------------------

firestore-write.go ::

 package main

import (

    "context"

    "log"

    firebase "firebase.google.com/go"

    "google.golang.org/api/option"

)


func main() {

    // 初期化

    ctx := context.Background()

    sa := option.WithCredentialsFile("./path/serviceAccount.json")

    app, err := firebase.NewApp(ctx, nil, sa)

    if err != nil {

        log.Fatalln(err)

    }


    client, err := app.Firestore(ctx)

    if err != nil {

        log.Fatalln(err)

    }

    // データ追加 field数や名は統一されてなくていいい

    _, _, err = client.Collection("users").Add(ctx, map[string]interface{}{

        "first": "Ada",

        "middle": "Mathison",

        "last":  "Lovelace",

        "born":  1815,

    })

    if err != nil {

        log.Fatalf("Failed adding alovelace: %v", err)

    }

    // 切断

    defer client.Close()

}

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
firestore-set.go:: for update
package main

import (
    "context"
    "log"

  //  "cloud.google.com/go/firestore" // なぜか不要 updateでは必要、delでも必要
    firebase "firebase.google.com/go"
    "google.golang.org/api/option"
)

func main() {
    // 初期化
    ctx := context.Background()
    sa := option.WithCredentialsFile("./path/serviceAccount.json")
    app, err := firebase.NewApp(ctx, nil, sa)
    if err != nil {
        log.Fatalln(err)
    }

    client, err := app.Firestore(ctx)
    if err != nil {
        log.Fatalln(err)
    }

    // データ追加
    _, err = client.Collection("users").Doc("user2").Set(ctx, map[string]interface{}{
        "first":  "Ada",
        "middle": "Mathison",
        "last":   "Lovelace",
        "born":   1815,
    })
    if err != nil {
        log.Fatalf("Failed adding alovelace: %v", err)
    }

    // 切断
    defer client.Close()
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
firestore-update.go::
package main

import (
    "context"

    "log"

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

func main() {
    // 初期化
    ctx := context.Background()
    sa := option.WithCredentialsFile("./path/serviceAccount.json")
    app, err := firebase.NewApp(ctx, nil, sa)
    if err != nil {
        log.Fatalln(err)
    }

    client, err := app.Firestore(ctx)
    if err != nil {
        log.Fatalln(err)
    }

    // データ更新
    _, updateError := client.Collection("users").Doc("user2").Set(ctx, map[string]interface{}{
        "first": "Yeah",
    }, firestore.MergeAll)
    if updateError != nil {
        // Handle any errors in an appropriate way, such as returning them.
        log.Printf("An error has occurred: %s", err)
    }

    // 切断
    defer client.Close()
}
----------------------------------------------
firestore-read.go::
package main

import (
    "context"
    "fmt"
    "log"

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

func main() {
    // 初期化
    ctx := context.Background()
    sa := option.WithCredentialsFile("./path/serviceAccount.json")
    app, err := firebase.NewApp(ctx, nil, sa)
    if err != nil {
        log.Fatalln(err)
    }

    client, err := app.Firestore(ctx)
    if err != nil {
        log.Fatalln(err)
    }

    // データ読み取り
    iter := client.Collection("users").Documents(ctx)
    for {
        doc, err := iter.Next()
        if err == iterator.Done {
            break
        }
        if err != nil {
            log.Fatalf("Failed to iterate: %v", err)
        }
        fmt.Println(doc.Data())
    }

    // 切断
    defer client.Close()
}
---------------------------------------------------------
firestore-coll-del.go::
package main

import (
    "context"
    "log"

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

func main() {
    // 初期化
    ctx := context.Background()
    sa := option.WithCredentialsFile("./path/serviceAccount.json")
    app, err := firebase.NewApp(ctx, nil, sa)
    if err != nil {
        log.Fatalln(err)
    }

    client, err := app.Firestore(ctx)
    if err != nil {
        log.Fatalln(err)
    }
    ref := client.Collection("users")
    deleteCollection(ctx, client, ref, 10)

}

func deleteCollection(ctx context.Context, client *firestore.Client,
    ref *firestore.CollectionRef, batchSize int) error {

    for {
        // Get a batch of documents
        iter := ref.Limit(batchSize).Documents(ctx)
        numDeleted := 0

        // Iterate through the documents, adding
        // a delete operation for each one to a
        // WriteBatch.
        batch := client.Batch()
        for {
            doc, err := iter.Next()
            if err == iterator.Done {
                break
            }
            if err != nil {
                return err
            }

            batch.Delete(doc.Ref)
            numDeleted++
        }

        // If there are no documents to delete,
        // the process is over.
        if numDeleted == 0 {
            return nil
        }

        _, err := batch.Commit(ctx)
        if err != nil {
            return err
        }
    }
}

0 件のコメント:

コメントを投稿