如何将多个更新 GORM MySql 查询合并为 1?
How to combine multiple update GORM MySql queries into 1?
我有一个 MySQL table 包含 4 列
(A(primary key, int), B(string), C(string), D(string)).
我想 运行 使用 A 更新查询查找行,我可以在其中更新 1、2 或所有 3 列(B、C、D)的数据。
我从前端以 JSON 格式获取数据。目前,我正在检查我输入的字符串的长度,如果它们 >0,我会一一更新这些列。所以在最坏的情况下,我将 运行ning 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 查询中执行此操作?
您可以使用 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})
我建议先根据您的情况建立模型。使用该模型 运行 只有一个 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)
我建议在地图上使用结构。 Go 是强类型语言,因此使用结构更加地道。
我有一个 MySQL table 包含 4 列
(A(primary key, int), B(string), C(string), D(string)).
我想 运行 使用 A 更新查询查找行,我可以在其中更新 1、2 或所有 3 列(B、C、D)的数据。 我从前端以 JSON 格式获取数据。目前,我正在检查我输入的字符串的长度,如果它们 >0,我会一一更新这些列。所以在最坏的情况下,我将 运行ning 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 查询中执行此操作?
您可以使用 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})
我建议先根据您的情况建立模型。使用该模型 运行 只有一个 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)
我建议在地图上使用结构。 Go 是强类型语言,因此使用结构更加地道。