提前致谢。 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
也没有显示validtill
和validfrom
。使用psql
对数据库进行独立检查确实证实了validtill
和validfrom
列中包含数据。
我在这里错过了什么?为什么错误?
谢谢。
在Go中有一种使用可空字段的特定方法。您应该使用可空类型,如sql.NullString
或sql.NullInt64
等。否则您将获得扫描错误。
您还应该在res.Next
块中为扫描定义变量。
本文详细解释了如何使用它 - https://pliutau.com/working-with-db-nulls/