Golang Метод де-сериализации БД (sqlx поверх базы данных / sql) - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть столбец Timestamp в базе данных и структура с типом int64, которая должна загружать столбец как целочисленную метку времени.

Запрос:

select date from table;

Ошибка :

sql: Scan error on column index 1, name "date": converting driver.Value type time.Time ("2019-04-14 21:49:59.159317 +0000 +0000") to a int64: invalid syntax

Есть ли способ определить метод сериализации в структуре вместо преобразования временной метки в int64 на уровне запроса (extract epoch...).

1 Ответ

1 голос
/ 30 апреля 2020

Вам нужен пользовательский тип int64, чтобы вы могли затем реализовать интерфейс sql.Scanner.

type Timestamp int64

func (ts *Timestamp) Scan(src interface{}) error {
    switch v := src.(type) {
    case time.Time:
        *ts = Timestamp(v.Unix())
    case []byte:
        // ...
    case string:
        // ...
    }
    return nil
}

При этом вы можете использовать преобразование при сканировании результата:

type Record struct {
    Date int64
}

var r Record
if err := db.QueryRow("select data from table").Scan((*Timestamp)(&r.Date)); err != nil {
    panic(err)
}

Или вы можете изменить тип поля в определении структуры, а затем выполнить сканирование непосредственно в поле:

type Record struct {
    Date Timestamp
}

var r Record
if err := db.QueryRow("select data from table").Scan(&r.Date); err != nil {
    panic(err)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...