Go + NoSQL(Couchbase) アプリ開発 ステップバイステップガイド (1)

# はじめに

Go + NoSQL(Couchbase) を使ったアプリ開発をステップバイステップで解説していきます。本記事は、シリーズの初回として位置付けられます。

今回は、データベースへの接続と、データの登録・取得という、基本的な部分を確認します。

その後、格納されたデータを確認する際に、SQLのJSONドキュメント用の拡張である、Couchbaseのクエリ言語、N1QL(Non 1st-normal-form Query Language: 非第一正規化クエリ言語)の利用について解説します。

## 前提
- Go
    - 開発環境がセットアップされている
- Couchbase Server
    - 開発環境にインストールされている(`localhost`でアクセス可能)
    - 管理者ユーザが作成されている(ID: `Administrator`、パスワード: `password`）
    - Bucket(`go_app`)が作成されている
    - コマンドラインツールにパスが通っている
- gitが利用できる環境

## 動作確認環境
- Mac OS Catalina Version 10.15.6
    - コマンドラインツールパス：`/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/`
- Go 1.15.5
- Couchbase Server 7.0 BETA


# プログラム解説

まずは、プログラムを示します。処理内容について、コメントを参照ください。

```go
package main

import (
	"fmt"
	"time"

	gocb "github.com/couchbase/gocb/v2"
)


func main() {
	// クラスターへの接続
	cluster, err := gocb.Connect(
		"localhost",
		gocb.ClusterOptions{
			Username: "Administrator",
			Password: "password",
		})
	if err != nil {
		panic(err)
	}
	// バケットへの参照の取得
	bucket := cluster.Bucket("go_app")

	// バケットに接続され確実に利用可能になるまで待つ
	err = bucket.WaitUntilReady(5*time.Second, nil)
	if err != nil {
		panic(err)
	}

	// コレクションへの参照の取得（デフォルトコレクションを利用）
	collection := bucket.DefaultCollection()

	// ドキュメントの定義（ユーザ情報）
	docUser := map[string]string{"id": "001", "name": "佐藤", "type": "user"}
	//　ドキュメントIDの定義
	docId := "user_001"

	// ドキュメントをUpsertする
	upsertResult, err := collection.Upsert(docId, docUser, &gocb.UpsertOptions{})
	if err != nil {
		panic(err)
	}
	// UpsertResultからCAS値を出力
	fmt.Println(upsertResult.Cas())

	// ドキュメントをGetする
	getResult, err := collection.Get(docId, &gocb.GetOptions{})
	if err != nil {
		panic(err)
	}

	// GetResultから、Contentを取得
	var myContent interface{}
	if err := getResult.Content(&myContent); err != nil {
		panic(err)
	}
	// Contentを出力
	fmt.Println(myContent)

}
```
プログラムをGithubで公開していますので、下記のように取得してください。

```
git clone https://github.com/YoshiyukiKono/couchbase_step-by-step_go_jp.git
```

プログラム実行例を下記に示します。

```
$ go run couchbase.go 
1608177225724985344
map[id:001 name:佐藤 type:user]
```

# 実行結果確認

Couchbase Serverのコマンドラインツール(`cbq`)を使って、登録されたデータを確認します。

```
$ cbq -u Administrator
 Enter Password: 
 Connected to : http://localhost:8091/. Type Ctrl-D or \QUIT to exit.

```

まず、プライマリインデックスを作成します。

```
cbq> CREATE PRIMARY INDEX go_app_primary ON go_app;
```

クエリを実行します。

```
cbq> SELECT id, name, type from go_app where name = "佐藤";
{
    "requestID": "7855dbe1-7f4e-4867-9740-1fbe9b4436c1",
    "signature": {
        "id": "json",
        "name": "json",
        "type": "json"
    },
    "results": [
    {
        "id": "001",
        "name": "佐藤",
        "type": "user"
    }
    ],
    "status": "success",
    "metrics": {
        "elapsedTime": "5.705668ms",
        "executionTime": "5.637332ms",
        "resultCount": 1,
        "resultSize": 77,
        "serviceLoad": 2
    }
}
```

# 最後に

今回の記事は以上です。

今回は、データベースへの接続と、データの登録・取得という、基本的な部分を確認しました。

今回のプログラムでは、キーによるアクセスのみを扱い、クエリでのアクセスについては、コマンドラインツールのみで扱いましたが、クエリをプログラムで実行することも、当然可能です。また、クエリについては、今回紹介したような単純なものではなく、一般にSQLを使った開発で用いられているようなもっと複雑なものが利用可能です。これについては、今後の記事で紹介できればと思っています。



# 参考情報

下記で、Couchbase Go SDKを使った様々な処理のサンプルプログラムを見つけることができます。

https://github.com/couchbase/docs-sdk-go/tree/release/2.1/modules/devguide/examples/go