この例は、Go で記述された非常に単純な「Hello World」アプリケーションであり、以下の方法を示しています。
- Cloud Bigtable インスタンスに接続する
- 新しいテーブルを作成する
- テーブルにデータを書き込む
- そのデータを読み取る
- テーブルを削除する
サンプルの実行
この例では、Go 用 Google Cloud クライアント ライブラリの Cloud Bigtable パッケージを使用して、Cloud Bigtable と通信します。
このサンプル プログラムを実行するには、GitHub でのサンプルの手順に沿って操作してください。
Cloud Bigtable での Cloud クライアント ライブラリの使用
このサンプル アプリケーションは Cloud Bigtable に接続して、いくつかの単純なオペレーションを行います。
クライアント ライブラリのインポート
このサンプルでは次のインポートが使用されています。
テーブルを管理するための Cloud Bigtable への接続
テーブルを管理するには、bigtable.NewAdminClient()
を使用して Cloud Bigtable に接続します。
テーブルの作成
AdminClient.CreateTable()
を使用してテーブルを作成し、AdminClient.TableInfo()
を使用してテーブルに関する情報を取得します。AdminClient.CreateColumnFamily()
を使用して列ファミリーを作成します。
データを管理するための Cloud Bigtable への接続
データを管理するには、bigtable.NewClient()
を使用して Cloud 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)
}
}