我想用 golang 訪問 bigquery 陣列結構。GCP 計費標準表查詢 q := client.Query(
SELECT billing_account_id,credits FROM " project.dataset.gcp_billing_export_xxxx"
WHERE DATE(_PARTITIONTIME) = '2021-11-24' and array_length(credits) > 0 LIMIT 1)
and explore data
for {
var row []bigquery.Value
err := it.Next(&row)
if err == iterator.Done {
break
}
if err != nil {
return err
}
fmt.Fprintln(w, row[1] )
}
row[1] 輸出:[ [GCP Enhanced Support 客戶將獲得 50% 的促銷折扣,截止日期為 2021 年 12 月 31 日。-0.03 GCP Enhanced Support 客戶將獲得 50% 的促銷折扣,截止日期為 2021 年 12 月 31 日。折扣] [總折扣花費 -0.001 總花費折扣 RESELLER_MARGIN] ]
row[1] 看起來像一個陣列結構,但我無法通過 row[1][0] 訪問它的元素,這里是錯誤訊息:無效操作:row[1][0](型別“cloud.google.com /go/bigquery".Value 不支持索引
有什么建議嗎?
問候, 史蒂文
uj5u.com熱心網友回復:
嘗試使用 Struct of Struct。credits描述在這里。
type creditsStruct struct {
id string
full_name string
type string
name string
amount float64
}
type myResultsStruct struct {
billing_account_id string
credits creditsStruct
}
for {
var c myResultsStruct
err := it.Next(&c)
if err == iterator.Done {
break
}
if err != nil {
// TODO: Handle error.
}
fmt.Println(c)
}
uj5u.com熱心網友回復:
您可以使用“func (*RowIterator) Next”
Next 將下一行加載到 dst 中。如果沒有更多結果,它的回傳值是 iterator.Done。一旦 Next 回傳 iterator.Done,所有后續呼叫都將回傳 iterator.Done。
dst 可以實作 ValueLoader,也可以是 *[]Value、*map[string]Value 或結構指標。如果 dst 是 *map[string]Value,如果 dst 為零,將創建一個新地圖。然后對于每個架構列名稱,該名稱的映射鍵將設定為該列的值。STRUCT 型別(RECORD 型別或嵌套模式)成為嵌套映射。
每個 BigQuery 列型別對應一種或多種 Go 型別;匹配的結構欄位必須是正確的型別。對應關系是:
STRING string
BOOL bool
INTEGER int, int8, int16, int32, int64, uint8, uint16, uint32
FLOAT float32, float64
BYTES []byte
TIMESTAMP time.Time
DATE civil.Date
TIME civil.Time
DATETIME civil.DateTime
重復欄位對應于元素型別的切片或陣列。STRUCT 型別(記錄或嵌套模式)對應于嵌套結構或結構指標。在同一個迭代器上對 Next 的所有呼叫都必須使用相同的結構型別。您可以查看更多資訊。你可以看到這個例子:
package main
import (
"context"
"fmt"
"cloud.google.com/go/bigquery"
"google.golang.org/api/iterator"
)
func main() {
ctx := context.Background()
client, err := bigquery.NewClient(ctx, "project-id")
if err != nil {
// TODO: Handle error.
}
type score struct {
Name string
Num int
}
q := client.Query("select name, num from t1")
it, err := q.Read(ctx)
if err != nil {
// TODO: Handle error.
}
for {
var s score
err := it.Next(&s)
if err == iterator.Done {
break
}
if err != nil {
// TODO: Handle error.
}
fmt.Println(s)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/365598.html
下一篇:取消參考帶有多個反斜杠的字串
