Golang中使用azcosmos的NewQueryItemsPager从Azure Cosmos DB读取数据时遇到错误

Golang中使用azcosmos的NewQueryItemsPager从Azure Cosmos DB读取数据时遇到错误 我正在尝试使用 azcosmos 包从 Azure Cosmos DB 表中读取数据。在之前的 v0.3.5 版本中,它工作正常。我已将其升级到 v0.3.6。 现在,queryPager.NextPage(context.Background()) 抛出错误“请求 URL 中没有主机”。

有人能告诉我我的代码哪里出了问题吗?

第 37 行 queryResponse, err := queryPager.NextPage(context.Background()) 抛出错误。

package main

import (
	"context"
	"encoding/json"
	"errors"
	"fmt"
	"log"
	"os"

	"github.com/Azure/azure-sdk-for-go/sdk/azcore"
	"github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos"
)

func GetUser() {
	endpoint := os.Getenv("Cosmos_DB_Endpoint")
	key := os.Getenv("Cosmos_DB_Key")

	cred, err := azcosmos.NewKeyCredential(key)
	if err != nil {
		log.Fatal("Failed to create a credential: ", err)
	}

	// Create a CosmosDB client
	client, err := azcosmos.NewClientWithKey(endpoint, cred, nil)
	if err != nil {
		log.Fatal("Failed to create Azure Cosmos DB client: ", err)
	}

	container, _ := client.NewContainer("DIM", "On-Behalf")
	pk := azcosmos.NewPartitionKeyNumber(1)

	queryPager := container.NewQueryItemsPager("SELECT c['On-Behalf'] FROM c", pk, nil)
	var result []map[string]interface{}

	for queryPager.More() {
		queryResponse, err := queryPager.NextPage(context.Background())
		if err != nil {
			var responseErr *azcore.ResponseError
			errors.As(err, &responseErr)
			panic(err)
		}

		for _, item := range queryResponse.Items {
			var itemResponseBody map[string]interface{}
			err = json.Unmarshal(item, &itemResponseBody)
			result = append(result, itemResponseBody)
			if err != nil {
				panic(err)
			}
		}
	}
	fmt.Print(result)
}

func main() {
	GetUser()
}


更多关于Golang中使用azcosmos的NewQueryItemsPager从Azure Cosmos DB读取数据时遇到错误的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中使用azcosmos的NewQueryItemsPager从Azure Cosmos DB读取数据时遇到错误的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个已知的azcosmos v0.3.6版本的问题。问题出现在NewQueryItemsPager方法的实现上。在v0.3.6中,分页器在创建时没有正确初始化请求URL。

以下是修复后的代码示例:

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"log"
	"os"

	"github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos"
)

func GetUser() {
	endpoint := os.Getenv("Cosmos_DB_Endpoint")
	key := os.Getenv("Cosmos_DB_Key")

	cred, err := azcosmos.NewKeyCredential(key)
	if err != nil {
		log.Fatal("Failed to create a credential: ", err)
	}

	client, err := azcosmos.NewClientWithKey(endpoint, cred, nil)
	if err != nil {
		log.Fatal("Failed to create Azure Cosmos DB client: ", err)
	}

	container, _ := client.NewContainer("DIM", "On-Behalf")
	pk := azcosmos.NewPartitionKeyNumber(1)

	// 使用正确的查询参数
	queryOptions := &azcosmos.QueryOptions{
		PartitionKey: pk,
	}

	queryPager := container.NewQueryItemsPager("SELECT c['On-Behalf'] FROM c", queryOptions)
	var result []map[string]interface{}

	for queryPager.More() {
		queryResponse, err := queryPager.NextPage(context.Background())
		if err != nil {
			log.Fatal("Failed to query items: ", err)
		}

		for _, item := range queryResponse.Items {
			var itemResponseBody map[string]interface{}
			err = json.Unmarshal(item, &itemResponseBody)
			if err != nil {
				log.Fatal("Failed to unmarshal item: ", err)
			}
			result = append(result, itemResponseBody)
		}
	}
	fmt.Print(result)
}

func main() {
	GetUser()
}

或者,你可以降级到v0.3.5版本:

go get github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos@v0.3.5

另一个临时解决方案是直接使用QueryItems方法而不是分页器:

func GetUser() {
	endpoint := os.Getenv("Cosmos_DB_Endpoint")
	key := os.Getenv("Cosmos_DB_Key")

	cred, err := azcosmos.NewKeyCredential(key)
	if err != nil {
		log.Fatal("Failed to create a credential: ", err)
	}

	client, err := azcosmos.NewClientWithKey(endpoint, cred, nil)
	if err != nil {
		log.Fatal("Failed to create Azure Cosmos DB client: ", err)
	}

	container, _ := client.NewContainer("DIM", "On-Behalf")
	pk := azcosmos.NewPartitionKeyNumber(1)

	queryOptions := &azcosmos.QueryOptions{
		PartitionKey: pk,
	}

	queryResponse, err := container.QueryItems(context.Background(), queryOptions, "SELECT c['On-Behalf'] FROM c")
	if err != nil {
		log.Fatal("Failed to query items: ", err)
	}

	var result []map[string]interface{}
	for _, item := range queryResponse.Items {
		var itemResponseBody map[string]interface{}
		err = json.Unmarshal(item, &itemResponseBody)
		if err != nil {
			log.Fatal("Failed to unmarshal item: ", err)
		}
		result = append(result, itemResponseBody)
	}
	fmt.Print(result)
}

GitHub上已经有一个相关的issue报告这个问题。开发团队正在修复中,预计会在下一个版本中解决。

回到顶部