gpt4 book ai didi

go - 将时间从 DB 转换为自定义时间失败

转载 作者:行者123 更新时间:2023-12-01 19:47:04 24 4
gpt4 key购买 nike

我需要从数据库中读取日期,将其转换为某个时间戳并将其转换为 JSON。

我有以下代码:

package usages

import (
"fmt"
"time"
)

type SpecialOffer struct {
PublishedDate jsonTime `gorm:"column:publishing_date" json:"published_date"`
ExpirationDate jsonTime `gorm:"column:expiration_date" json:"expiration_date"`
}

type jsonTime struct {
time.Time
}

func (tt jsonTime) MarshalJSON() ([]byte, error) {
jsonTime := fmt.Sprintf("\"%s\"", tt.Format("20060102"))
return []byte(jsonTime), nil
}

当我像这样运行它时,我收到以下错误:
sql: Scan error on column index 8, name "publishing_date": unsupported Scan, storing driver.Value type time.Time into type *usages.trvTime 

而且数据有误:
{"published_date":"00010101","expiration_date":"00010101"}

如果我更改 SpecialOffer要使用的结构 time.Time ,它返回正确,但显然格式错误:
{"published_date":"2020-03-12T00:00:00Z","expiration_date":"2020-06-12T00:00:00Z"}

我究竟做错了什么?

最佳答案

您应该实现 sql.Scanner driver.Valuer 接口(interface)。

像这样的东西:

func (j *jsonTime) Scan(src interface{}) error {
if t, ok := src.(time.Time); ok {
j.Time = t
}
return nil
}

func (j jsonTime) Value() (driver.Value, error) {
return j.Time, nil
}

这是必要的,因为 database/sql gorm 使用的包和其他一些 go ORM,如果不是全部的话,只为少数几种类型提供开箱即用的支持。

大多数支持的类型是语言的基本内置类型,如 string , int , bool等。通过扩展它还支持任何自定义用户定义类型,其基础类型是上述基本类型之一,然后支持 []byte类型和相关 sql.RawBytes输入,最后是 time.Time类型也支持ootb。

您可能想要写入或从数据库读取的任何其他类型都需要实现上述两个接口(interface)。 sql.ScannerScan在将列的值解码为一种受支持的类型后,将自动调用方法(这就是为什么您需要针对 time.Time 而不是针对,例如 []byte 键入断言的原因)。 driver.ValuerValue方法在驱动程序将其编码为对目标列有效的格式之前自动调用(这就是为什么您可以直接返回 time.Time 而不是自己进行编码)。

请记住,
type jsonTime struct {
time.Time
}

甚至
type jsonTime time.Time

声明一个不等于 time.Time 的新类型这就是为什么 database/sql 没有接收到它的原因包裹。

关于go - 将时间从 DB 转换为自定义时间失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61630216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com