dks*_*551 5 go snowflake-cloud-data-platform
我正在使用“gosnowflake”驱动程序从我的 Golang 应用程序中查询 Snowflake DB。雪花模式:- NAME STRING AGE INTEGER LOCS ARRAY
Golang 代码:-
package main
import (
"database/sql"
"fmt"
"log"
"strings"
_ "github.com/snowflakedb/gosnowflake"
)
type Person struct {
Name string
Age string
Locs []string
}
var DB *sql.DB
func main() {
connString := "USER" + ":" + "PWD" + "@" + "REGION" + "/" + "TEST"
fmt.Println("DB Connection string..", connString)
DB, _ = sql.Open("snowflake", connString)
defer DB.Close()
QRY := "SELECT NAME,AGE,LOCS FROM TEST.PERSON WHERE NAME='abc'"
result, _ := DB.Query(QRY)
fmt.Println(result)
for result.Next() {
var row Person
err := result.Scan(&row.Name, &row.Age, &row.Locs)
if err != nil {
log.Fatal(err)
}
fmt.Println("Before returning..", row)
}
}
Run Code Online (Sandbox Code Playgroud)
问题:- 这里的问题出在数组中的 DB LOCS 中,但在从 golang 代码查询时,它以字符串形式返回。所以这些值就像
[
"XYZ",
"DEF"
]
Run Code Online (Sandbox Code Playgroud)
我想要的是在我的 golang 代码中直接将 LOCS 值转换为数组。因此,在 Person 结构体中,它直接绑定到 Loc []string。
除非 gosnowflake 中已经有内置的字符串数组类型,否则您可能需要实现遵循sql.Scanner 接口的自己的类型
例如
type ArrayString []string
func (a *ArrayString) Scan(src interface{}) error {
switch v := src.(type) {
case string:
return json.Unmarshal([]byte(v), a)
case []byte:
return json.Unmarshal(v, a)
default:
return errors.New("invalid type")
}
}
Run Code Online (Sandbox Code Playgroud)
那么你的Person结构将是:
type Person struct {
Name string
Age string
Locs ArrayString
}
Run Code Online (Sandbox Code Playgroud)