gorm create 静默失败因不校验字段且不抛错,需检查 result.error 和 rowsaffected;shouldbindjson 需 binding tag 和 validator 初始化;时间戳要用 *time.time 或 gorm tag 并加 json:"-";url id 解析须防 panic 并判 0 和 errrecordnotfound。

为什么 Create 会静默失败?
GORM 的 Create 方法不校验字段有效性,也不抛异常——哪怕 Email 重复、Age 超出 uint8 范围,它也可能返回 err == nil,但实际没写入任何记录。
- 必须手动检查
result.Error和result.RowsAffected:仅判err != nil是不够的 -
RowsAffected == 0很可能意味着主键冲突、唯一索引失败,或传入了非法零值 ID - 前端传了
ID?GORM 会当成“更新已存在记录”,导致 INSERT 变成 UPDATE 或直接报错
如何让 ShouldBindJSON 真正校验字段?
c.ShouldBindJSON 默认完全忽略结构体 tag(比如 validate:"required,email"),不会自动触发校验逻辑。
- 必须显式引入
go-playground/validator并在结构体字段上加bindingtag - 调用前要确保 validator 实例已注册到 Gin:
gin.SetMode(gin.ReleaseMode)不影响校验,但别漏掉初始化 - 示例:
Name string `json:"name" binding:"required,min=2"`,否则空字符串或单字符照样过
CreatedAt/UpdatedAt 怎么自动填充又不被 JSON 覆盖?
靠数据库默认值没用,GORM 的时间戳行为由 struct tag 和字段类型共同控制;用错类型或 tag,更新时就会被零值覆盖。
- 推荐用
gorm.Model嵌入,它自带CreatedAt、UpdatedAt和DeletedAt字段,且已配好行为 - 若自定义字段,必须声明为
*time.Time(指针),或加gorm:"autoCreateTime;autoUpdateTime"tag - 同时加
json:"-"禁止 JSON 解析写入,否则前端传{"created_at":null}会把时间清零
URL 参数里的 id 怎么安全解析?
直接用 c.Param("id") + strconv.ParseUint(..., 10, 64) 是最简路径,但漏掉错误处理就会 panic 或查全表。
- 必须捕获
strconv.ErrSyntax,并统一返回400 Bad Request - 查库前先判断解析出的
id是否为0:GORM 对0ID 默认跳过 WHERE 条件,可能触发全表扫描 - 查不到记录时,别返回
200 {},要用result.Error == gorm.ErrRecordNotFound显式判,并返回404
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











