Как преобразовать массив снежинок в массив в Golang при запросе базы данных

Я использую драйвер "gosnowflake" для запроса базы данных Snowflake из моего приложения Golang. Схема "снежинка": - НАЗВАНИЕ СТРОКА ВОЗРАСТ Целочисленный массив LOCS

Код Голанга: -

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)
    }


}

Проблема: - Проблема здесь в LOCS БД в массиве, но при запросе из кода golang он возвращается в виде строки. поэтому значения похожи на

[
   "XYZ",
   "DEF"
]

Я хочу напрямую преобразовать значения LOCS в массив в моем коде golang. Итак, внутри структуры Person он напрямую связывается со строкой Loc [].


person dks551    schedule 27.10.2018    source источник
comment
Прошло некоторое время, но @ dks551 удалось ли вам найти решение?   -  person Rachel McGuigan    schedule 25.10.2019


Ответы (1)


Если в gosnowflake еще нет встроенного типа массива строк, вам может потребоваться реализовать свой собственный тип, следующий за Интерфейс sql.Scanner

e.g.

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
}
person ssemilla    schedule 27.10.2018