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
更多关于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报告这个问题。开发团队正在修复中,预计会在下一个版本中解决。

