Go の Hello World
この例は、Go で記述された非常に単純な「Hello World」アプリケーションであり、以下の方法を示しています。
- 認証の設定
- Bigtable インスタンスに接続する
- 新しいテーブルを作成する
- テーブルにデータを書き込む
- そのデータを読み取る
- テーブルを削除する
認証の設定
このページの Go サンプルをローカル開発環境から使用するには、gcloud CLI をインストールして初期化し、自身のユーザー認証情報を使用してアプリケーションのデフォルト認証情報を設定してください。
-
Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
gcloud init
-
Google アカウントのローカル認証情報を作成します。
gcloud auth application-default login
詳細については、
ローカル開発環境の認証の設定 をご覧ください。
サンプルの実行
この例では、Go 用 Google Cloud クライアント ライブラリの Cloud Bigtable パッケージを使用して、Bigtable と通信します。
このサンプル プログラムを実行するには、GitHub にあるサンプルの手順に沿って操作してください。
Bigtable での Cloud クライアント ライブラリの使用
このサンプル アプリケーションは Bigtable に接続して、いくつかの単純なオペレーションを行います。
クライアント ライブラリのインポート
このサンプルでは次のインポートが使用されています。
テーブルを管理するための Bigtable への接続
テーブルを管理するには、bigtable.NewAdminClient()
を使用して Bigtable に接続します。
テーブルの作成
AdminClient.CreateTable()
を使用してテーブルを作成し、AdminClient.TableInfo()
を使用してテーブルに関する情報を取得します。AdminClient.CreateColumnFamily()
を使用して列ファミリーを作成します。
データを管理するための Bigtable への接続
データを管理するには、bigtable.NewClient()
を使用して Bigtable に接続します。
テーブルへの行の書き込み
データを書き込むテーブルを開きます。bigtable.NewMutation()
を使用して 1 つの行にミューテーションを作成し、Mutation.Set()
を使用してその行に値を設定します。各行で固有の行キーを生成します。これらの手順を繰り返して複数のミューテーションを作成します。最後に、Table.ApplyBulk()
を使用してすべてのミューテーションをテーブルに適用します。
キーによる行の読み取り
Table.ReadRow()
でキーを使用して、行を直接取得します。
すべてのテーブル行のスキャン
Table.ReadRows()
を使用して、テーブル内のすべての行をスキャンします。このメソッドを使用し終わったら、データ クライアントを終了します。
テーブルの削除
AdminClient.DeleteTable()
を使用して、テーブルを削除します。このメソッドの使用が終わったら、管理クライアントを終了します。
すべてを組み合わせる
コメントなしの例を以下に示します。
package main
import (
"context"
"flag"
"fmt"
"log"
"cloud.google.com/go/bigtable"
)
const (
tableName = "Hello-Bigtable"
columnFamilyName = "cf1"
columnName = "greeting"
)
var greetings = []string{"Hello World!", "Hello Cloud Bigtable!", "Hello golang!"}
func sliceContains(list []string, target string) bool {
for _, s := range list {
if s == target {
return true
}
}
return false
}
func main() {
project := flag.String("project", "", "The Google Cloud Platform project ID. Required.")
instance := flag.String("instance", "", "The Google Cloud Bigtable instance ID. Required.")
flag.Parse()
for _, f := range []string{"project", "instance"} {
if flag.Lookup(f).Value.String() == "" {
log.Fatalf("The %s flag is required.", f)
}
}
ctx := context.Background()
adminClient, err := bigtable.NewAdminClient(ctx, *project, *instance)
if err != nil {
log.Fatalf("Could not create admin client: %v", err)
}
tables, err := adminClient.Tables(ctx)
if err != nil {
log.Fatalf("Could not fetch table list: %v", err)
}
if !sliceContains(tables, tableName) {
log.Printf("Creating table %s", tableName)
if err := adminClient.CreateTable(ctx, tableName); err != nil {
log.Fatalf("Could not create table %s: %v", tableName, err)
}
}
tblInfo, err := adminClient.TableInfo(ctx, tableName)
if err != nil {
log.Fatalf("Could not read info for table %s: %v", tableName, err)
}
if !sliceContains(tblInfo.Families, columnFamilyName) {
if err := adminClient.CreateColumnFamily(ctx, tableName, columnFamilyName); err != nil {
log.Fatalf("Could not create column family %s: %v", columnFamilyName, err)
}
}
client, err := bigtable.NewClient(ctx, *project, *instance)
if err != nil {
log.Fatalf("Could not create data operations client: %v", err)
}
tbl := client.Open(tableName)
muts := make([]*bigtable.Mutation, len(greetings))
rowKeys := make([]string, len(greetings))
log.Printf("Writing greeting rows to table")
for i, greeting := range greetings {
muts[i] = bigtable.NewMutation()
muts[i].Set(columnFamilyName, columnName, bigtable.Now(), []byte(greeting))
rowKeys[i] = fmt.Sprintf("%s%d", columnName, i)
}
rowErrs, err := tbl.ApplyBulk(ctx, rowKeys, muts)
if err != nil {
log.Fatalf("Could not apply bulk row mutation: %v", err)
}
if rowErrs != nil {
for _, rowErr := range rowErrs {
log.Printf("Error writing row: %v", rowErr)
}
log.Fatalf("Could not write some rows")
}
log.Printf("Getting a single greeting by row key:")
row, err := tbl.ReadRow(ctx, rowKeys[0], bigtable.RowFilter(bigtable.ColumnFilter(columnName)))
if err != nil {
log.Fatalf("Could not read row with key %s: %v", rowKeys[0], err)
}
log.Printf("\t%s = %s\n", rowKeys[0], string(row[columnFamilyName][0].Value))
log.Printf("Reading all greeting rows:")
err = tbl.ReadRows(ctx, bigtable.PrefixRange(columnName), func(row bigtable.Row) bool {
item := row[columnFamilyName][0]
log.Printf("\t%s = %s\n", item.Row, string(item.Value))
return true
}, bigtable.RowFilter(bigtable.ColumnFilter(columnName)))
if err = client.Close(); err != nil {
log.Fatalf("Could not close data operations client: %v", err)
}
log.Printf("Deleting the table")
if err = adminClient.DeleteTable(ctx, tableName); err != nil {
log.Fatalf("Could not delete table %s: %v", tableName, err)
}
if err = adminClient.Close(); err != nil {
log.Fatalf("Could not close admin client: %v", err)
}
}