如何将多个更新 GORM MySql 查询合并为一个查询?

huangapple go评论83阅读模式
英文:

How to combine multiple update GORM MySql queries into 1?

问题

我有一个包含4列(A(主键,整数)、B(字符串)、C(字符串)、D(字符串))的MySQL表。

我想运行一个更新查询,使用A找到行,然后可以更新1、2或3列(B、C、D)的数据。我从前端以JSON格式获取数据。目前,我正在检查输入字符串的长度,如果长度大于0,则逐个更新这些列。所以在最坏的情况下,我将运行3个SQL更新。是否有一种方法可以使用GORM和Golang在1个SQL查询中完成这个操作?

示例JSON结构:
{
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查询中完成这个操作?

英文:

I have a MySQL table containing 4 columns

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

I want to run an update query finding row using A, where I can update data of 1, 2, or all 3 columns(B, C, D).
I get the data from the front-end in JSON format. Currently, I am checking the length of strings I get in input, and if they are >0, I update those columns one by one. So in the worst case, I will be running 3 SQL updates.
Is there a way to do this in 1 SQL query using GORM, and Golang?

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

In this case, I only want to update columns B and D.

I will unmarshal this using a Golang structure which will be of the form

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

So in Golang value of C will be an empty string.

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})
        }

Is there a way to do this in 1 SQL query using GORM, and Golang?

答案1

得分: 2

我建议首先根据你的条件构建一个模型。使用该模型运行一个SQL查询。在playground上查看完整的示例这里

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

        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)

我建议使用结构体而不是映射。Go是一种强类型语言,因此使用结构体更符合惯例。

英文:

I would suggest to build a Model according to your conditions first. Use that model to run only one SQL query. Check the complete example on playground here.

Note that gorm will take care of some missing fields. Now if the rating.C is blank, gorm will not update the value of c column in record.

        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)

I would suggest using structs over map. Go is strongly typed language thus using structs is more idiomatic.

答案2

得分: 0

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

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

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

Updates

英文:

You can use Updates to update multiple fields.

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

huangapple
  • 本文由 发表于 2021年7月25日 15:53:28
  • 转载请务必保留本文链接:https://go.coder-hub.com/68516618.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定