【问题标题】:Save is trying to update created_at column保存正在尝试更新 created_at 列
【发布时间】:2021-02-24 14:37:26
【问题描述】:

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

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

if err != nil {
    return err
}

生成以下 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

返回以下错误

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

与这些实体

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
}

DB.Omit 允许在执行更新查询时忽略列。但这需要在代码库中进行大量重构。行为是否发生了变化或有什么遗漏?

【问题讨论】:

标签: go go-gorm


【解决方案1】:

这可能会对您有所帮助。像这样更改结构字段(或添加以替换默认的 gorm.Model 字段):

CreatedAt time.Time `gorm:"<-:create"` // allow read and create, but don't update

这个标签有助于保存从更新中创建的数据。

【讨论】:

    【解决方案2】:

    在 Gorm v2 中,Save(..) 将所有字段写入数据库。由于 CreatedAt 字段为零值,因此将其写入数据库。

    为了让您的代码正常工作,您可以使用地图:

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

    另一种选择是不填写 Record 结构,而只是指向表并使用 Where 子句:

    err := r.writeDB.Model(&Record{}).Where("id = ?", 1).Update("name","AB").Error
    

    如果您有多个更新,您可以将 Updates(...) 与地图一起使用,请参见此处:https://gorm.io/docs/update.html

    【讨论】:

      猜你喜欢
      • 2016-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 2013-03-28
      相关资源
      最近更新 更多