先谢谢了。
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
也不会显示validtill
和validfrom
。使用psql
对数据库进行的独立检查确实确实验证了其中有数据的validtill
和validfrom
列。
我在这里想念什么?为什么会出错?
谢谢。
答案 0 :(得分:-1)
在Go中有一种处理可空字段的特定方法。您应该使用sql.NullString
或sql.NullInt64
等可空类型,否则将出现扫描错误。
此外,您还应该在res.Next
块中为“扫描”定义变量。
本文详细说明了如何使用-https://pliutau.com/working-with-db-nulls/