【问题标题】:How to combine multiple update GORM MySql queries into 1?如何将多个更新 GORM MySql 查询合并为 1?
【发布时间】:2021-10-01 14:39:20
【问题描述】:

我有一个包含 4 列的 MySQL 表

(A(primary key, int), B(string), C(string), D(string)).

我想使用 A 运行更新查询查找行,我可以在其中更新 1、2 或所有 3 列(B、C、D)的数据。 我从前端以 JSON 格式获取数据。目前,我正在检查输入字符串的长度,如果它们>0,我将一一更新这些列。所以在最坏的情况下,我将运行 3 个 SQL 更新。 有没有办法在使用 GORM 和 Golang 的 1 个 SQL 查询中做到这一点?

Example JSON structure
{
A: 23,
B: "word1",
D: "word2"
}

在这种情况下,我只想更新 B 列和 D 列。

我将使用以下形式的 Golang 结构来解组它

type rating struct{
    A int,
    B string,
    C string,
    D string
        }

所以在 Golang 中 C 的值将是一个空字符串。

var rating_var rating
if len(rating_var.B)>0{
       db.Model(&ratings).where("A=?",rating_var.A).Update(map[struct]interface{}{"B": rating_var.B})
        }

if len(rating_var.C)>0{
       db.Model(&ratings).where("A=?",rating_var.A).Update(map[struct]interface{}{"C": rating_var.C})
        }

if len(rating_var.D)>0{
       db.Model(&ratings).where("A=?",rating_var.A).Update(map[struct]interface{}{"D": rating_var.D})
        }

有没有办法在使用 GORM 和 Golang 的 1 个 SQL 查询中做到这一点?

【问题讨论】:

  • 你如何在这里得到输入?您可以在前端/后端缓存这些输入,以便您可以运行一个 SQL 查询吗?戈姆是一名司机,并不固执己见。我相信如果你不能缓存输入,你将不得不运行 3 个 SQL 更新。
  • 输入长度 >0 是一个字段的输入吗?您处理该字段以创建另外 3 个值?这里的 Json 结构是什么?你也可以添加吗
  • @ShaileshSuryawanshi 我是 Golang 新手,目前,我正在通过 Postman 将这些值以 JSON 格式发送到后端(Golang)。
  • @ShaileshSuryawanshi 更新了问题的详细信息。
  • UPDATE table_name SET B = json.B, C = json.C WHERE A = json.A; 这个 SQL 查询可以工作吗?如果是这种情况,您是否需要帮助为 Gorm 构建此 sql 查询? gorm.io/docs/update.html此文档可能会有所帮助

标签: mysql go go-gorm


【解决方案1】:

我建议先根据您的条件构建模型。使用该模型仅运行一个 SQL 查询。查看 Playground here 上的完整示例。

请注意,gorm 会处理一些缺失的字段。现在如果rating.C 为空,gorm 将不会更新记录中c column 的值。

        rating := Rating{
                A: 1,
                B: "b1",
                D: "d2",
        }

        var toUpdate RatingModel
        if len(rating.B) > 0 {
                toUpdate.B = rating.B
        }

        if len(rating.C) > 0 {
                toUpdate.C = rating.C
        }

        if len(rating.D) > 0 {
                toUpdate.D = rating.D
        }
        db.Model(&toUpdate).Where("A=?", rating.A).Updates(toUpdate)

我建议在 map 上使用结构。 Go 是强类型语言,因此使用结构更符合习惯。

【讨论】:

  • 感谢您的帮助。
【解决方案2】:

您可以使用Updates 更新多个字段。

db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})

db.Model(&ratings).where("A=?",rating_var.A).Updates(map[struct]interface{}{"B": rating_var.B, "C": rating_var.C})

Updates

【讨论】:

    猜你喜欢
    • 2016-04-02
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多