Error 1292 (22007): Incorrect datetime value: ‘0000-00-00‘ for column ‘deleted_at‘

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去插入

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值