gpt4 book ai didi

mysql - time.Time 的子类型不使用 gorm lib 创建列

转载 作者:行者123 更新时间:2023-11-29 09:29:21 25 4
gpt4 key购买 nike

我正在尝试向数据库添加时间戳,并返回带有表示时间戳的数字的 json,而不是时间戳的当前字符串表示形式;本质上是重写 time.Time

的 marshal、unmarshal
type JSONTime time.Time

func (j *JSONTime) UnmarshalJSON(data []byte) error {
if string(data) == "null" {
return nil
}
millis, err := strconv.ParseInt(string(data), 10, 64)
if err != nil {
return err
}
*j = JSONTime(time.Unix(0, millis*int64(time.Millisecond)))
return err
}

func (t JSONTime) MarshalJSON() ([]byte, error) {
//do your serializing here
stamp := fmt.Sprintf("%d", time.Time(t).Unix()*1000)
return []byte(stamp), nil
}
type table struct {
ID int64 `gorm:"primary_key;auto_increment"json:"id"`
CreatedAt JSONTime json:"createdAt"`
UpdatedAt JSONTime json:"updatedAt"`
}

我遇到的问题是上面的代码只是忽略了数据库中列的创建(创建了其他字段)。我什至手动创建了该列,但 gorm 也没有添加数据。

我相信编码和解码工作,但问题在于使用它们之前(即将列添加到数据库)

我在这里做错了什么?

我正在使用MySQL和图书馆gorm

更新1:

以前我的表结构如下:

type table struct {
ID int64 `gorm:"primary_key;auto_increment"json:"id"`
CreatedAt time.Time json:"createdAt"`
UpdatedAt time.Time json:"updatedAt"`
}

这大部分都有效(例如在数据库上创建列)

在数据库连接方面,我基本使用的是:

root:password@tcp(127.0.0.1:3306)/database?parseTime=true

并对我的存储库使用自动迁移:

db,err := // get db connection 
if err != nil {
panic("Failed to connect to database")
}
db.AutoMigrate(&table{})

最佳答案

感谢@mkopriva,我终于弄清楚了。

有一些问题:

1- MarshalJSONand UnmarshalJSON 仅用于数据库交互之前和之后

2-结构table定义没有正确的gorm定义:

type tablestruct {
ID int64 `gorm:"primary_key;auto_increment"json:"id"`
CreatedAt timeLib.JSONTime `gorm:"type:timestamp;default:current_timestamp"json:"createdAt"`
UpdatedAt timeLib.JSONTime `gorm:"type:timestamp;default:current_timestamp ON update current_timestamp"json:"updatedAt"`
}

3-由于类型JSONTime是一个新类型,驱动程序不知道如何转换它,所以我们需要重写Value:

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

4-最后我们需要重写 Scan 以便将数据库值转换为 JSONTime

func (jsonTime *JSONTime) Scan(value interface{}) error {
if value == nil {
*jsonTime = JSONTime(time.Now())
return nil
}
if readTime, err := driver.DefaultParameterConverter.ConvertValue(value); err == nil {
if convertedTime, ok := readTime.(time.Time); ok {
*jsonTime = JSONTime(convertedTime)
return nil
}
}
return errors.New("failed to scan TIME")
}

关于mysql - time.Time 的子类型不使用 gorm lib 创建列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59030584/

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