提问人:Ajal Ck 提问时间:3/18/2023 更新时间:3/19/2023 访问量:331
SQL COALESCE 函数不适用于 GORM
SQL COALESCE function is not working with GORM
问:
DB.Model(&domain.Products{}).Where("product_code", product.Product_Code).
Updates(map\[string\]interface{}{
"product_image": gorm.Expr("COALESCE(?, products.product_image)", product.Product_Image),
"size": gorm.Expr("COALESCE(?, products.size)", product.Size),
"color": gorm.Expr("COALESCE(?, products.color)", product.Color),
"unit_price": gorm.Expr("COALESCE(?, products.unit_price)", product.Unit_Price),
"stock": gorm.Expr("COALESCE(?, products.stock)", product.Stock),
})
这是一个 gorm 查询,用于在更新表时管理 null 值插入。 如果新值(传入值)为 null,我想通过将现有值保留在表中来更新表。 但是在我的代码中,表正常更新,这意味着 null 值和非 null 值都像往常一样更新。我希望有人能帮助我
我也尝试了gorm原始查询。但它也不起作用
ar.DB.Exec("UPDATE products SET size = COALESCE(?, size) WHERE product_code = ?", product.Size, product.Product_Code)
答:
0赞
Stephan Schlecht
3/19/2023
#1
COALESCE 返回第一个不是 的参数。nil
为此,您需要提供指针。但是,从注释中的代码片段可以看出,没有提供任何指针。因此,将更新所有指定的字段。
具体来说,你的(或你的程序中的任何名称)类型应该看起来更像这样:Products
package domain
type Products struct {
Product_Code int `gorm:"not null"`
Product_Image *string
Size *int
Color *string
Unit_price *float64
Stock *int
}
请注意,字段被定义为指针。
然后,它将像这样使用:
newStock := 12
prod := domain.Products{
product_code: 42,
product_image: nil,
size: nil,
color: nil,
unit_price: nil,
stock: &newStock,
}
正弦,除了 only 将在数据库中更新之外,所有字段都是。nil
stock
stock
评论
domain.Products
Product := domain.products{ product_code: 42, product_image: nil, size: nil, color: nil, unit_price: nil, stock: &newStock, }