如何验证数据库字段的唯一性?环境:Gin+GORM+[go-playground/validator]

1ySyz2kCwk · 2020-03-10 09:25:52 · 1475 次点击

自定义验证

先写一个函数校验用户名

func UserNameValidate(field validator.FieldLevel) bool {
    userModel := model.UserModel{}
    username := field.Field().String()
    if userModel.CheckUsernameExist(username) {
        return false
    }
    return true
}

注册到 gin 中间件

       r := gin.Default()

    if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
        _ = v.RegisterValidation("username_unique", requestValidate.UserNameValidate)
    }

最后表单 tag 可以写


Username        string `form:"username" json:"username" binding:"required,username_unique"`

此代码片段来源于我的开源项目:https://github.com/endachao/goerhub-api ,我正在写一个开源的社区系统,目前刚起了个头。欢迎关注

#4
更多评论

最好是通用性设计,我希望比如打tag这样,要不然以后好几个字段都是unique不至于一个一个手写。

#1

对gorm/validator不熟悉,看的很懵。

理论上说,这种唯一字段的判断,应该不是orm的事,是表单验证的事。

数据库和表单是完全不应该有任何关联的两种对象,一个是用户输入,一个是数据持久化,明显应该用两个不同的struct。

所以,正常情况下,对唯一性的判断要做两件事情。

一个是验证时查找数据库,就是说,理论上你需要一个自定义的验证方法。

另一个是插入失败后的处理。

另外不得不说,不管是orm还是表单验证,通过tag来做真的实在不符合我的审美……

#2