csdn0811 2024-05-25 17:48 采纳率: 60.7%
浏览 21
已结题

关于gorm使用Updates修改status为0的问题!(语言-golang)

如果前端传来的status是0,那么方法一不能修改数据库中status的值(非0值可以),使用方法二可以正常修改数据库中status的值,为什么?困扰我好久了

 <input {{ if eq .access.Status 1 }} checked {{ end }} type="radio" name="status" value="1" id="a" /> <label for="a">显示</label>
 <input {{ if eq .access.Status 0 }} checked {{ end }} type="radio" name="status" value="0"id="b" /> <label for="b">隐藏</label>
CREATE TABLE `access` (
  `id` int NOT NULL AUTO_INCREMENT,
  `module_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '0',
  `type` tinyint(1) DEFAULT NULL,
  `action_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  `url` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  `module_id` int DEFAULT NULL,
  `sort` int DEFAULT NULL,
  `description` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,
  `status` int DEFAULT NULL,
  `add_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
);



```go
方法一:
    access := model.Access{}
    access.ModuleName = moduleName
    access.Type = accessType
    access.ActionName = actionName
    access.Url = url
    access.ModuleId = moduleId
    access.Sort = sort
    access.Description = description
    access.Status = status
    access.AddTime = time.Now()

    fmt.Println("修改后的状态是:", access.Status)

    // 修改数据库
    err := dao.Mdb.Where("id = ?", id).Updates(&access).Error


方法二:
    access := model.Access{}
    dao.Mdb.Find(&access, id)
    access.ModuleName = moduleName
    access.Type = accessType
    access.ActionName = actionName
    access.Url = url
    access.ModuleId = moduleId
    access.Sort = sort
    access.Description = description
    access.Status = status
    access.AddTime = time.Now()

    fmt.Println("修改后的状态是:", access.Status)

    // 修改数据库
    err := dao.Mdb.Save(&access).Error
  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-05-25 17:48
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在使用Golang的Gorm库时,UpdatesSave方法在更新数据库记录时的行为是不同的。Updates方法用于只更新指定的字段,而Save方法会更新所有非零值字段,即使这些字段在传入的记录中没有被显式设置。

    在您提供的例子中,如果前端传入的status是0,并且status字段在数据库表中默认值为NULL,那么在方法一中,如果access.Status没有被显式设置为0(即在代码中没有写access.Status = status),Gorm的Updates方法可能不会更新这个字段,因为它认为这个字段没有变化。如果status字段在数据库中默认为NULL,并且前端传入的status为0,那么在Updates方法中,如果access.Status没有被显式设置,Gorm可能会认为这个字段不需要更新,因为对于Gorm来说,0和NULL是不同的。

    另一方面,Save方法会检查记录中的所有字段,并将非零值的字段更新到数据库中。即使status字段在数据库中的默认值是NULL,如果access.Status在代码中被显式设置为0,Save方法会认为这是一个有效的更新,并将其写入数据库。

    为了解决这个问题,您可以确保在方法一中显式设置access.Status字段,即使它的值是0。例如:

    access.Status = status // 确保status被设置,即使它是0
    

    另外,您也可以检查数据库中的status字段是否允许NULL值,如果不允许,那么前端传入的0应该能够被正确更新。

    至于HTML模板代码,它看起来是用来生成单选按钮,允许用户选择显示或隐藏状态。这部分代码应该没有问题,因为它只是根据后端传递的.access.Status值来决定哪个单选按钮应该被选中。

    最后,关于参考资料,Gorm的官方文档是一个很好的资源,您可以在这里找到更多关于UpdatesSave方法的信息:

    • Gorm官方文档:https://gorm.io/docs/

    希望这能帮助您解决问题!如果有其他疑问或需要进一步的帮助,请随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月2日
  • 已采纳回答 5月25日
  • 创建了问题 5月25日