iris中删除操作必须显式调用app.delete()注册路由,路径参数用{id}格式,通过ctx.params().get("id")获取;需校验id合法性、资源存在性及数据库操作结果,软删须配合gorm deletedat字段与全局scope配置。

删除操作必须显式调用 DELETE 路由,Iris 不自动绑定 HTTP 方法
Iris 默认不会把 Delete 方法映射到 DELETE 请求,必须手动注册路由。常见错误是写了个 DeleteUser 函数但用 Get 或 Post 注册,结果请求 404 或静默失败。
- 用
app.Delete("/users/{id}", handler)显式声明,不是app.Get - 路径参数需用
{id}(花括号),不能写成:id或$id—— Iris 只认前者 - 如果同时支持软删和硬删,建议分两个路由,比如
/users/{id}/soft和/users/{id},避免逻辑混杂
ctx.Params().Get("id") 获取路径参数,别用 ctx.URLParam
ctx.URLParam 是取查询参数(?id=123),而 RESTful 删除通常走路径参数。混淆会导致 id 为空,查不到数据却误判为“删除成功”。
- 正确方式:
id := ctx.Params().Get("id"),然后手动转成整型或校验格式 - 若数据库用 int64 主键,推荐用
strconv.ParseInt(id, 10, 64),别用atoi(已弃用) - 空字符串或非法值要提前返回
ctx.StatusCode(400),否则可能触发 panic 或误删
执行删除前务必检查资源是否存在,避免静默失败
Iris 不拦截数据库层的“影响行数为 0”,如果直接 db.Delete(&user).Error 后就返回 200,前端会以为删除成功,实际什么都没做。
- 用 GORM 时:先
First查询,再Delete;或用Delete(...).RowsAffected == 0判断 - 用原生 SQL 时:用
db.Exec("DELETE FROM users WHERE id = ?", id)后检查result.RowsAffected() - 不要省略错误检查:
if err != nil { ctx.StatusCode(500); return },尤其在事务中
软删需启用 gorm.DeletedAt 并配置全局 Scope
如果项目要求软删,光加 gorm.DeletedAt 字段不够 —— GORM 默认仍会查出已软删记录,除非显式调用 Unscoped() 或配置全局行为。
- 模型定义中必须包含
DeletedAt gorm.DeletedAt `gorm:"index"` - 初始化 DB 时加
db.Callback().Query().Before("gorm:query").Register("soft_delete:select", softDeleteSelect)(如需默认隐藏) - 更稳妥的做法是:软删路由里只更新
DeletedAt,硬删路由才真正Unscoped().Delete()
DeletedAt 字段名、Iris 的 Params() 提取方式、以及是否需要事务回滚,这三处最容易被跳过验证。











