Golang Postgres缺少时间戳列

时间:2018-11-27 09:43:30

标签: postgresql go timestamp

先谢谢了。 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)

如您所见,最后两列的类型为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列。

我在这里想念什么?为什么会出错?

谢谢。

1 个答案:

答案 0 :(得分:-1)

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

此外,您还应该在res.Next块中为“扫描”定义变量。

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