gin框架和xorm踩坑记录

记录一下实操过程中遇到的问题或者疑惑,也有一些是需要注意的点,既然花了时间解决就值得记录下来

 

  • required认为值为0不通过校验

    • 背景:
      gin框架中一般用通过定义结构体中的字段Tag标签来设置参数校验规则和解析字段名,转json相关信息,其中字段是否为必须项规则写在字段Tag:`binding:"required"`
    • 场景描述:
      我定义了一个VO结构体用来绑定前端参数,其中有个字段Status int `binding:"required, eq=0|eq=1"`,我希望绑定的时候验证Status不为空,且值为0或1
      但是实际上Status为1的时候通过校验,为0的时候却返回了error:Error:Field validation for 'Status' failed on the 'required' tag即Status字段绑定时不满足required校验
      实际处理过程没这么清晰,但最后查到了文档`binding:"required"`会认为0是空值而不通过校验
    • 解决方案:
      把整数字段改成整数指针类型,指针没有默认值0,也就没有这个问题了,注意取值加*,设值加&总之记得他是指针就好了
    • 结论:
      对数字类型的字段使用gin的校验时,一定注意0值的处理,想象一下某个必填字段,测试的时候随便测了几个值没发现任何问题,上线后一旦该字段为0就会报错

 

  • xorm不指定列通过Update传入对象判断不为空的更新会忽略0值

    • 背景:
      可以用xorm的Update()传入结构体对象,xorm会用你传入的结构体对象中不为空值的字段更新数据库
    • 场景:
      还是上边的场景,Status字段值为0/1,如果用这个方法更新Status为0永远存不进去,因为int的0会被当成空值
      对于这种情况一定要指定要用.Cols(数据库字段名).Update(model对象)指定更新的列,即使是0值也会更新
    • 总结:
      表中有可能为0的数字类型字段更新时,如果用Update方法要指定更新的列

 

  • xorm自动管理创建时间,更新时间(标签),即使指定列更新也会更新时间

    • 背景:
      很多表需要创建时间和更新时间两个字段,xorm可以识别model字段`created`和`updated`标签帮我们自动管理这两个字段,即插入和更新自动填写/更新
    • 场景:
      还是上例的指定更新列,那么问题来了,我没有指定创建时间和更新时间,更新的时候xorm会更新对应时间吗
      答案是会的,即使指定要更新的列里没有,也会自动更新
    • 结论:
      指定列更新时不需要指定标示`created`和`updated`的时间字段,没想到什么场景会导致问题,既然是更新时间那么任何的更新都应该刷新时间

 

  • 注意:

    • Bind/ShouldBind会根据请求头里Content-Type类型解析,如果是json格式一定要加application/json,或者直接用BindJSON/ShouldBindJSON

    • 在   struct 加上该注释并没有用,必须使用   dive 标记,它告诉 required 校验 深入到  slice、array 这样的子结构体里。

你可能感兴趣的:(GO)