首頁 >後端開發 >Golang >SQL COALESCE 函數不適用於 GORM

SQL COALESCE 函數不適用於 GORM

PHPz
PHPz轉載
2024-02-10 14:57:101016瀏覽

SQL COALESCE 函数不适用于 GORM

php小編新一在這裡為大家介紹SQL中的COALESCE函式。 COALESCE函數用於傳回參數清單中的第一個非NULL值。然而,需要注意的是,在使用GORM(Go語言的ORM框架)時,COALESCE函數可能會出現一些問題。這是因為GORM對於查詢語句的處理方式與傳統的SQL語句不同。因此,如果你在使用GORM時遇到了COALESCE函數的問題,可能需要考慮其他的解決方案。

問題內容

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 查詢,用於在我們更新表時管理空值插入。 如果新值(傳入值)為空,我想透過保留表中的現有值來更新表。 但在我的程式碼中,表正常更新,這意味著空值和非空值都正常更新。我希望有人能幫我

我也嘗試過 gorm 原始查詢。但它也不起作用

ar.DB.Exec("UPDATE products SET size = COALESCE(?, size) WHERE product_code = ?", product.Size, product.Product_Code)

解決方法

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, 
}

正弦所有欄位都是 nil,除了 stock 之外,只有 stock 會在資料庫中更新。

以上是SQL COALESCE 函數不適用於 GORM的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除