英文:
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})
英文:
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})
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论