我正在使用“ gosnowflake”驱动程序从我的Golang应用程序查询Snowflake DB。 雪花模式:- NAME STRING 年龄整数 LOCS阵列
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)
}
}
问题:-此处的问题在数组的DB LOCS中,但是在从golang代码中查询时,它以字符串形式返回。所以值就像
[
"XYZ",
"DEF"
]
我想要的是在我的golang代码中直接将LOCS值转换为数组。因此,在Person结构中,它直接绑定到Loc [] string。
答案 0 :(得分:0)
除非gosnowflake中已经有内置的字符串数组类型,否则您可能需要实现自己的sql.Scanner Interface之后的类型
例如
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")
}
}
那么您的Person
结构将是:
type Person struct {
Name string
Age string
Locs ArrayString
}