Reputation: 93
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?
Upvotes: 0
Views: 2880
Reputation: 1270
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.
Upvotes: 2