Golang结合Gin+GORM操作MySQL插入返回201但数据未存储问题求助
问题排查及修复方案
核心问题1:GORM操作未捕获错误,插入失败无感知
你当前所有GORM数据库操作都没有判断返回的错误,即使插入执行失败,代码依然会正常走成功返回逻辑,这就是你看到返回201但实际没数据的直接原因。
先修改仓库层的InsertData方法,增加错误返回:
func (db *dataConnection) InsertData(b entity.Data) (entity.Data, error) { if err := db.connection.Save(&b).Error; err != nil { return b, err } return b, nil }
同步修改DataRepository接口定义、服务层逻辑,在控制器层捕获错误后返回对应的异常响应,就能知道具体插入失败的原因。
核心问题2:日期零值触发MySQL约束,插入失败
你的Data实体和DataCreateDTO中的CreatedAt字段都没有配置自动填充标签,且DTO中该字段没有json标签,客户端发起POST请求时不会传递该字段,映射到实体后就是time.Time类型的零值0001-01-01 00:00:00。
而MySQL默认开启NO_ZERO_DATE的SQL模式,不允许写入零值日期,直接导致插入语句执行失败。
修复方案:
- 给实体类的
CreatedAt加GORM自动填充标签,插入时自动写入当前时间:
// data.go 实体类修改 type Data struct { ID uint64 `gorm:"primary_key:auto_increment" json:"id"` Title string `gorm:"type:varchar(255)" json:"title"` CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"` }
- DTO中删除不需要客户端传递的
ID和CreatedAt字段,创建数据时这两个字段都由服务端自动生成:
// data-dto.go 修改 type DataCreateDTO struct { Title string `json:"title" binding:"required"` // 加必填校验,避免空标题写入 }
其他可选优化
- 开启GORM调试日志,方便排查SQL执行问题:
修改config.go中的数据库初始化逻辑,开启日志输出:
import "gorm.io/gorm/logger" // 初始化数据库时增加日志配置 db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Info), // 打印所有SQL语句和执行结果 })
- 替换字段映射逻辑,避免smapping库的隐式映射问题:
你当前用smapping做DTO到实体的映射,如果字段规则不匹配很容易出现映射失败的问题,小项目可以直接手动赋值更稳妥:
// data-service.go Insert方法修改 func (service *dataService) Insert(b dto.DataCreateDTO) entity.Data { data := entity.Data{ Title: b.Title, } res, err := service.dataRepository.InsertData(data) if err != nil { log.Printf("插入数据失败: %v", err) } return res }
内容的提问来源于stack exchange,提问作者Notation
相关产品推荐
相关产品推荐

