Сканирование Postgres составного типа - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть составной тип, определенный для использования в таблице:

CREATE TYPE duration AS (
    hours NUMERIC,
    minutes NUMERIC
);

CREATE TABLE foo (
    id SERIAL PRIMARY KEY,
    my_duration duration
);

INSERT INTO foo (id, my_duration) VALUES
(1, ROW(1, 30));

Как я могу отсканировать это с помощью database/sql?Когда я реализую интерфейс сканера с помощью

func (d *Duration) Scan(value interface{}) error {
    log.Println(value)
    if value == nil {
        *d = Duration{
            Hours:   -1,
            Minutes: -1,
        }
        return nil
    }
    if duration, ok := value.(Duration); ok {
        *d = Duration(duration)
        return nil
    }
    return errors.New("Failed to scan duration")
}

Тип интерфейса выглядит как []uint8, а само значение представляет собой закодированный массив, что-то вроде [40 50 44 51 51 41].Как правильно разобрать составной тип?

edit: у меня есть Duration структура, определенная как

type Duration struct {
    Hours   int
    Minutes int
}

1 Ответ

1 голос
/ 01 апреля 2019

Срез байтов [40 50 44 51 51 41] при преобразовании в строку и печати в стандартный вывод выглядит следующим образом (2,33), см. Ссылку .

Итак, вы можете видеть, что из базы данных вы получаете кортеж с двумя целыми числами, разделенными запятой. Обладая этими знаниями, вы можете реализовать интерфейс сканера, который анализирует значения пользовательских типов данных.

func (d *Duration) Scan(value interface{}) error {
    if b, ok := value.([]byte); ok {
        ss := strings.Split(strings.Trim(string(b), "()"), ",")
        if len(ss) != 2 {
            return errors.New("unknown Duration format: " + string(b))
        }

        h, err := strconv.Atoi(ss[0])
        if err != nil {
            return err
        }
        m, err := strconv.Atoi(ss[1])
        if err != nil {
            return err
        }

        d.Hours, d.Minutes = h, m
    } else {
        d.Hours, d.Minutes = -1, -1
    }
    return nil
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...