Столбцы меток времени отсутствуют в postgres - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть таблица Postgres с именем certs с 4 столбцами.

enter code here
\d certs
                        Table "public.certs"
Column       |            Type             | Collation | Nullable | Default
-------------+-----------------------------+-----------+----------+---------
uuid         | character varying(255)      |           | not null |
serialnumber | bigint                      |           |          |
validtill    | timestamp without time zone |           |          |
validfrom    | timestamp without time zone |           |          |
Indexes:
"certs_pkey" PRIMARY KEY, btree (uuid)

Как вы можете видеть, последние 2 столбца имеют тип timestamp.Теперь я пытаюсь прочитать все строки в столбцах следующим образом

res, err := sql.DB.Query("SELECT * from certs;")
if err == nil{
    log.Fatal(err)
}
fmt.Println(res.Columns())
defer res.Close()
var id string
var serialNumber int64
var validFrom time.Time
var validTill time.Time
fmt.Println(res.ColumnTypes())
for res.Next() {
    err := res.Scan(&id, &serialNumber, &validFrom, &validTill)
    fmt.Println(res.Columns())
    if err != nil {
        log.Errorf("error %v", err)
    } else {
        cs.Certs[id] = serialNumber
    }

В основном я пытаюсь декодировать полученные значения.

Я получаю следующую ошибку

 error sql: expected 2 destination arguments in Scan, not 4

Кроме того, печать res.columns() печатает это

[uuid serialnumber] <nil>

Как вы можете видеть, есть ошибка, и напечатанные columns не показывают validtill и validfrom.Независимая проверка базы данных с использованием psql действительно проверяет наличие столбцов validtill и validfrom с данными в них.

Что мне здесь не хватает?Почему ошибка?

Ответы [ 2 ]

0 голосов
/ 22 августа 2019

Я использую «gopkg.in/nullbio/null.v6» для тех же операций, и вы можете определить свои данные как:

import "gopkg.in/nullbio/null.v6"

blablablah ...

var validFrom null.Time
0 голосов
/ 27 ноября 2018

В Go существует особый способ работы с полями, которые можно обнулять.Вы должны использовать такие типы, как sql.NullString или sql.NullInt64 и т. Д. В противном случае вы получите ошибки сканирования.

Также вы должны определить переменные для сканирования внутри блока res.Next.

Эта статьяподробно объясняет, как его использовать - https://pliutau.com/working-with-db-nulls/

...