Your Question
批量upsert, count如何在原有基础上增加新值
The document you expected this should be explained
Expected answer
Comment From: starryrbs
可以使用 gorm.Expr
var products = []Product{{
Price: 100,
Code: "240",
}}
db.Clauses(clause.OnConflict{
Columns: []clause.Column{
{Name: "Code"},
},
DoUpdates: clause.Assignments(map[string]interface{}{"Price": gorm.Expr("price + ?", 1)}),
}).CreateInBatches(&products, 1000)
Comment From: tangqiu0205
我想加的值是每个结构体内的count的值, 而不是固定的值.
Comment From: starryrbs
没理解你的需求,可以写一下sql语句吗
Comment From: tangqiu0205
循环遍历的写法, 我是觉得循环遍历有点费数据量资源, 就想改为批量的写法.
Comment From: starryrbs
可以试试 case when语法
var products = []Product{{
Price: 100,
Code: "240",
}, {
Price: 100,
Code: "240",
}}
id := 1
db.Clauses(clause.OnConflict{
Columns: []clause.Column{
{Name: "Code"},
},
DoUpdates: clause.Assignments(map[string]interface{}{"Price":
gorm.Expr(" case `id` when ? then price + ? end", id, 3)}),
}).CreateInBatches(&products, 1000)
sql 如下:
INSERT INTO `products` (`created_at`,`updated_at`,`deleted_at`,`code`,`price`) VALUES
("2022-01-29 23:17:51.864","2022-01-29 23:17:51.864",NULL,"240",100),
("2022-01-29 23:17:51.864","2022-01-29 23:17:51.864",NULL,"240",100)
ON CONFLICT (`Code`) DO UPDATE SET `Price`= case `id` when 1 then price + 3 end RETURNING `id`
Comment From: Aimmit
DoUpdates: clause.Assignments(map[string]interface{}{"count": gorm.Expr("count+ VALUES(count)")})