GORM钩子BeforeCreate解决异常记录插入

117 阅读1分钟

GORM钩子

BeforeCreate

UpdateInstanceBillUsage 当前插入记录,错误 2023-08 2023-08-10 错误:Error 1366 (HY000): Incorrect decimal value: '' for column 'usage' at row 248

  • 原因:用'' 插入只允许浮点的字段
  • 解决:可以通过 BeforeCreate 验证异常字段值,并强制置为默认值
type InstanceBillItemsUsage struct {
	gorm.Model
	...

	Usage         *string  `json:"Usage,omitempty"`         
	
	...
}
// BeforeCreate 钩子方法,在创建记录之前调用
func (u *InstanceBillItemsUsage) BeforeCreate(tx *gorm.DB) (err error) {
	// 检查字段是否合法,如果不合法,设置为默认值
	//rType := reflect.TypeOf(u.Usage)
	//if rType.Kind() != reflect.Float32 || rType.Kind() != reflect.Float64  {

	var v = "0.00"
	if *u.Usage == "''" || u.Usage == nil || *u.Usage == "" {
	
		u.Usage = &v // 设置默认值

	}

	return nil
}

其他解决思路:

  • GORM设置默认值

    这样,如果尝试插入空值,数据库将自动使用默认值,避免了错误。但这取决于业务逻辑是否允许这样做。

  • 获取到异常值时,直接代码处理,不借助钩子

    除了使用钩子进行验证,还可以使用go-playground/validator 进行更复杂验证