クイック スタート: Go 用の Azure Cosmos DB for NoSQL ライブラリを使用して、次のことを行います

適用対象: NoSQL

Go 用の Azure Cosmos DB for NoSQL クライアント ライブラリを使用して、コンテナー内のデータのクエリを実行し、個々の項目で一般的な操作を実行できます。 次の手順に従って、Azure Developer CLI を使用して最小限のソリューションを環境にデプロイしてください。

API のリファレンス ドキュメント | ライブラリのソース コード | パッケージ (Go) | Azure Developer CLI

前提条件

設定

このプロジェクトの開発コンテナーをお使いの環境にデプロイします。 次に、Azure Developer CLI (azd) を使って、Azure Cosmos DB for NoSQL アカウントを作成し、コンテナー化されたサンプル アプリケーションをデプロイします。 サンプル アプリケーションでは、クライアント ライブラリを使って、サンプル データの管理、作成、読み取り、クエリを実行します。

GitHub codespaces で開く

開発コンテナーで開く

重要

GitHub アカウントには、ストレージとコア時間のエンタイトルメントが無料で含まれています。 詳細については、GitHub アカウントに含まれるストレージとコア時間に関する記事を参照してください。

  1. プロジェクトのルート ディレクトリでターミナルを開きます。

  2. azd auth login を使って Azure Developer CLI に対して認証します。 ツールによって指示された手順に従って、任意の Azure 資格情報を使って CLI に対して認証します。

    azd auth login
    
  3. azd init を使ってプロジェクトを初期化します。

    azd init
    
  4. 初期化中に、一意の環境名を構成します。

    ヒント

    この環境名は、ターゲット リソース グループ名としても使用されます。 このクイックスタートでは、msdocs-cosmos-db の使用を検討してください。

  5. azd up を使って、Azure Cosmos DB アカウントをデプロイします。 Bicep テンプレートは、サンプル Web アプリケーションもデプロイします。

    azd up
    
  6. プロビジョニング プロセス中に、サブスクリプションと目的の場所を選択します。 プロビジョニング プロセスが完了するまで待ちます。 このプロセスには 5 分ほどかかる可能性があります。

  7. Azure リソースのプロビジョニングが完了すると、実行中の Web アプリケーションへの URL が出力に含まれます。

    Deploying services (azd deploy)
    
      (✓) Done: Deploying service web
    - Endpoint: <https://[container-app-sub-domain].azurecontainerapps.io>
    
    SUCCESS: Your application was provisioned and deployed to Azure in 5 minutes 0 seconds.
    
  8. コンソールで URL を使って、ブラウザーで Web アプリケーションに移動します。 実行中のアプリの出力を確認します。

    実行中の Web アプリケーションのスクリーンショット。

クライアント ライブラリをインストールする

クライアント ライブラリは、azcosmos パッケージとして Go 経由で使用できます。

  1. ターミナルを開き、/src フォルダーに移動します。

    cd ./src
    
  2. azcosmos パッケージがまだインストールされていない場合は、go install を使ってインストールします。

    go install github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos
    
  3. また、azidentity パッケージがまだインストールされていない場合はインストールします。

    go install github.com/Azure/azure-sdk-for-go/sdk/azidentity
    
  4. src/go.mod ファイルを開いて確認し、github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos および github.com/Azure/azure-sdk-for-go/sdk/azidentity エントリが両方とも存在することを確認してください。

オブジェクト モデル

名前 説明
CosmosClient このクラスは主要なクライアント クラスであり、アカウント全体のメタデータやデータベースを管理するために使われます。
CosmosDatabase このクラスはアカウント内のデータベースを表します。
CosmosContainer このクラスは主に、コンテナーまたはコンテナー内に格納されている項目の読み取り、更新、削除操作を実行するために使われます。
PartitionKey このクラスは論理パーティション キーを表します。 このクラスは、多くの一般的な操作とクエリに必要です。

コード例

テンプレートのサンプル コードでは、cosmicworks というデータベースと products というコンテナーを使います。 products コンテナーには、各製品の名前、カテゴリ、数量、一意識別子、販売フラグなどの詳細が含まれています。 コンテナーでは、論理パーティション キーとして /category プロパティを使います。

クライアントを認証する

ほとんどの Azure サービスに対するアプリケーション要求は、承認される必要があります。 アプリケーションと Azure Cosmos DB for NoSQL の間でパスワードレスの接続を実装するため、推奨される方法として、DefaultAzureCredential 型を使います。 DefaultAzureCredential は複数の認証方法をサポートしており、実行時に使用する方法が決定されます。

重要

パスワード、接続文字列、その他の資格情報を使用して、Azure サービスへの要求を直接承認することもできます。 ただし、この方法は慎重に使用する必要があります。 開発者は、安全でない場所にこれらのシークレットを公開しないように注意する必要があります。 パスワードまたは秘密鍵へのアクセス権を取得したユーザーは誰でも、データベース サービスに対して認証を行うことができます。 DefaultAzureCredential はアカウント キーよりも管理しやすく、セキュリティが優れており、キーを保存するリスクなくパスワードレス認証が可能になります。

このサンプルでは azcosmos.NewClient を使用して CosmosClient の新しいインスタンスを作成し、DefaultAzureCredential インスタンスを使用して認証します。

credential, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
    return err
}

clientOptions := azcosmos.ClientOptions{
    EnableContentResponseOnWrite: true,
}

client, err := azcosmos.NewClient(endpoint, credential, &clientOptions)
if err != nil {
    return err
}

データベースの取得

client.NewDatabase を使って、cosmicworks という既存のデータベースを取得します。

database, err := client.NewDatabase("cosmicworks")
if err != nil {
    return err
}

コンテナーの取得

database.NewContainer を使って既存の products コンテナーを取得します。

container, err := database.NewContainer("products")
if err != nil {
    return err
}

項目を作成する

JSON にシリアル化するすべてのメンバーを含む Go 型をビルドします。 この例では、型には一意識別子、カテゴリ、名前、数量、価格、販売のフィールドが含まれます。

type Item struct {
    Id 			string	`json:"id"`
    Category 	string	`json:"category"`
    Name 		string	`json:"name"`
    Quantity 	int		`json:"quantity"`
    Price		float32	`json:"price"`
    Clearance	bool	`json:"clearance"`
}

container.UpsertItem を使ってコンテナー内に項目を作成します。 このメソッドは "アップサート" を行い、項目が既に存在する場合は、それを効果的に置き換えます。

item := Item {
    Id:			"70b63682-b93a-4c77-aad2-65501347265f",
    Category:	"gear-surf-surfboards",
    Name:		"Yamba Surfboard",
    Quantity:	12,
    Price:		850.00,
    Clearance:	false,
}

partitionKey := azcosmos.NewPartitionKeyString("gear-surf-surfboards")

context := context.TODO()

bytes, err := json.Marshal(item)
if err != nil {
    return err
}

response, err := container.UpsertItem(context, partitionKey, bytes, nil)
if err != nil {
    return err
}

項目を読み取る

一意識別子 (id) フィールドとパーティション キー フィールドの両方を使って、ポイント読み取り操作を実行できます。 container.ReadItem を使って、特定の項目を効率的に取得できます。

partitionKey := azcosmos.NewPartitionKeyString("gear-surf-surfboards")

context := context.TODO()

itemId := "70b63682-b93a-4c77-aad2-65501347265f"

response, err := container.ReadItem(context, partitionKey, itemId, nil)
if err != nil {
    return err
}

if response.RawResponse.StatusCode == 200 {
    read_item := Item{}
    err := json.Unmarshal(response.Value, &read_item)
    if err != nil {
        return err
    }

クエリ項目

container.NewQueryItemsPager を使って、コンテナー内の複数の項目に対してクエリを実行します。 次のパラメーター化クエリを使用して、指定されたカテゴリ内のすべての項目を検索します。

SELECT * FROM products p WHERE p.category = @category
partitionKey := azcosmos.NewPartitionKeyString("gear-surf-surfboards")

query := "SELECT * FROM products p WHERE p.category = @category"

queryOptions := azcosmos.QueryOptions{
    QueryParameters: []azcosmos.QueryParameter{
        {Name: "@category", Value: "gear-surf-surfboards"},
    },
}

pager := container.NewQueryItemsPager(query, partitionKey, &queryOptions)

pager.NextPage を使用して結果の各ページをループすることにより、クエリのページ分割された結果を解析します。 pager.More を使用して、各ループの開始時に結果が残っているかどうかを判断します。

context := context.TODO()

items := []Item{}

requestCharge := float32(0)

for pager.More() {
    response, err := pager.NextPage(context)
    if err != nil {
        return err
    }

    requestCharge += response.RequestCharge

    for _, bytes := range response.Items {
        item := Item{}
        err := json.Unmarshal(bytes, &item)
        if err != nil {
            return err
        }
        items = append(items, item)
    }
}

リソースをクリーンアップする

サンプル アプリケーションやリソースが不要になったら、対応するデプロイとすべてのリソースを削除します。

azd down

GitHub Codespaces で、実行中のコードスペースを削除して、ストレージとコア エンタイトルメントを最大化します。

次のステップ