缺少Golang ACC时间戳列

问题描述 投票:0回答:1

提前致谢。 Golang新手在这里。我有一个名为certs的Postgres表,有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也没有显示validtillvalidfrom。使用psql对数据库进行独立检查确实证实了validtillvalidfrom列中包含数据。

我在这里错过了什么?为什么错误?

谢谢。

postgresql go timestamp
1个回答
-1
投票

在Go中有一种使用可空字段的特定方法。您应该使用可空类型,如sql.NullStringsql.NullInt64等。否则您将获得扫描错误。

您还应该在res.Next块中为扫描定义变量。

本文详细解释了如何使用它 - https://pliutau.com/working-with-db-nulls/

© www.soinside.com 2019 - 2024. All rights reserved.