gorm结构体零值不更新问题及解决方案
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">问题描述</a></li><li><a href="#_label1">解决办法</a></li><li><a href="#_label2">总结</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>问题描述</h2><p>在使用gorm的时候如果用结构体进行update或者updates会出现零值、空值不更新的问题,常见的办法有两种:</p>
<p>1.使用Save(),但是Save会保存所有字段,也就是说,必须将<strong>所有字段信息</strong>全部获取才能更新,否则没有传值的字段会更新成空。</p>
<p>2.使用map接口,即mapinterface{},但是当我们使用的是protobuf定义了的结构时,转换成map有些许麻烦。</p>
<p>那么该如何解决呢?</p>
<p class="maodian"><a name="_label1"></a></p><h2>解决办法</h2>
<p>合理结合结构体和map来达到可以更新0值的结果。由于在传入字段的时候如果为0值或者空值会被gorm自动忽略,所以在传入的时候注意需要传入一个可判断的字段,</p>
<p>例如我在这里让前端传的是“无”这个字符串,判断是否为“无”字符串,如果是,那么新建一个mapinterface{}包含number并赋值为空(或者0)。</p>
<p>然后正常将其他字段更新一遍,再通过map将零/空值字段进行更新保存。</p>
<div class="jb51code"><pre class="brush:go;"> var null sql.NullString
if object.Number == "无" {
values := mapinterface{}{
"id": objectTmp.Id,
"number": null.String,
}
repo.db.Model(&object).Update(objectTmp)//正常更新一遍
repo.db.Model(&object).Update(values)//将为0值的字段更新一遍
}</pre></div>
<p>注意:</p>
<p>1. gorm不能传nil到数据库,只能传空字符串,所以在数据库里保存的是<strong>空字符串</strong>。</p>
<p>2. 更新单行数据一定要在map里面加上<strong>主键</strong>赋值,否则会批量更新,在我这里是id。</p>
<p class="maodian"><a name="_label2"></a></p><h2>总结</h2>
<p>以上为个人经验,希望能给大家一个参考,也希望大家多多支持琼殿技术社区。</p>
頁:
[1]