Save 正在尝试更新created_at 列

ser*_*dar 4 go go-gorm

我们正在将项目从 v1 更新到 v2。当我们尝试通过仅提供更改的字段作为结构来更新行时,它会尝试设置created_at列并返回错误。这在 v1 中就起作用了。根据文档,在更新操作期间,具有默认值的字段将被忽略。

err := r.writeDB.Save(&Record{
    Model:   Model{
        ID:        1,
    },
    Name:    "AB",
}).Error

if err != nil {
    return err
}
Run Code Online (Sandbox Code Playgroud)

生成以下 SQL 语句

[3.171ms] [rows:0] UPDATE `records` SET `created_at`='0000-00-00 00:00:00',`updated_at`='2020-11-12 15:38:36.285',`name`='AB' WHERE `id` = 1
Run Code Online (Sandbox Code Playgroud)

返回以下错误

错误 1292:日期时间值不正确:第 1 行的“created_at”列的“0000-00-00”

有了这些实体

type Model struct {
    ID        int       `gorm:"primary_key,type:INT;not null;AUTO_INCREMENT"`
    CreatedAt time.Time `gorm:"type:TIMESTAMP(6)"`
    UpdatedAt time.Time `gorm:"type:TIMESTAMP(6)"`
}

type Record struct {
    Model
    Name         string
    Details      string
}
Run Code Online (Sandbox Code Playgroud)

DB.Omit允许在执行更新查询时忽略列。但这需要对代码库进行大量重构。行为发生改变还是缺少某些东西?

Ole*_*hel 6

这可能对你有帮助。更改结构字段(或添加以替换默认的 gorm.Model 字段),如下所示:

CreatedAt time.Time `gorm:"<-:create"` // allow read and create, but don't update
Run Code Online (Sandbox Code Playgroud)

此标签有助于保存更新时创建的数据。