Error 1292 (22007): Incorrect datetime value: ‘0000-00-00’ for column
‘deleted_at’ at row 1
背景:
gorm.model:
import "time"
// Model a basic GoLang struct which includes the following fields: ID, CreatedAt, UpdatedAt, DeletedAt
// It may be embedded into your model or you may build your own model without it
//
// type User struct {
// gorm.Model
// }
type Model struct {
ID uint `gorm:"primarykey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt DeletedAt `gorm:"index"`
}
sql.NullTime:
也就是说在代码层是可以为空的(必须地)
使用gorm的migrate从结构体到数据表映射时time 类型会被映射为datetime(3),但是可以为Null
------------------------------------------------------------------------------------
然后创建新纪录时
方式一:直接使用gorm.db去写,然后结构体就使用业务层面定义的结构体,将空gorm.model{}传入,这种方式是把deleteAt作为Null去插入新纪录的,没有问题
err := r.DB.Create(users).Error
if err != nil {
zap.L().Error(logger.FailLog("CreateLuckyUsers() "), zap.Error(err))
}
return err
方式二:使用gorm-gen的这种方式是把deleteAt作为"0000-00-00"去插入新纪录的,出现上述问题
type CGroup struct {
gorm.Model
ChatID int64
Type string `json:"type"`
Title string `json:"title,omitempty"`
}
newModel := c_groups.NewModel()
//newModel.DeletedAt = time.Now().AddDate(-1000, 0, 0)
newModel.ChatId = Chat.ID
newModel.Type = Chat.Type
newModel.Title = Chat.Title
id, err := newModel.Create(ctx.DB.GetDbW().WithContext(ctx.CtxBg))
if err != nil {
fmt.Println("create group error: ", err)
}
解决方案一:像这样:newModel.DeletedAt = time.Now().AddDate(-1000, 0, 0)将DeletedAt赋值,但是坏处是搜索的时候会被认为是已删除的,不推荐
解决方案二:数据库层面 手动更改数据表字段类型为varchar() 这样就可以插入‘0000-00-00’了
解决方案三:自己写一个create的函数 不使用 gorm-gen生成的,或者像上边方式一 一样操作,推荐
解决方案四:有时间有本事的可以去改下生成器的源码 将 ‘0000-00-00’ 作为Null去插入