Your Question

批量upsert, count如何在原有基础上增加新值 Gorm 批量upsert, 某个字段如何在原有基础上增加新值?

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

循环遍历的写法, 我是觉得循环遍历有点费数据量资源, 就想改为批量的写法. Gorm 批量upsert, 某个字段如何在原有基础上增加新值?

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