亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

調用 Updates() 時 GORM 更新空字段?

調用 Updates() 時 GORM 更新空字段?

Go
三國紛爭 2022-06-27 16:41:42
根據GORM 的文檔:Updates 支持使用 struct 或 map[string]interface{} 進行更新,使用 struct 更新時默認只會更新非零字段我的數據庫中已經有一個Service帶有 ID 的條目,abc123. 我正在嘗試獲取如下所示的對象:Service{  ID: "abc123",  Name: "new service name",  CreatedAt: nil,}并用它來更新我現有的記錄。但是當我打電話時:tx.Model(&service).Updates(service)數據庫中的CreatedAt值被覆蓋nil。如何在不覆蓋值的情況下更新我的數據庫記錄CreatedAt?更新:下面是我的Service結構type Service struct {  ID        string  `gorm:"not null;type:char(32);primary_key;column:id"`  Name      string  `json:"name" gorm:"size:50;not null;"`  CreatedAt *time.Time  UpdatedAt time.Time  DeletedAt *time.Time `gorm:"index"`}我為我的Service結構嘗試了兩種不同的變體。另一個是CreatedAt類型time.Time而不是*time.Time. *time.Time它將用空值覆蓋我的數據庫中的值。time.Time它嘗試用未初始化的時間值覆蓋數據庫中的值并引發錯誤:Error 1292: Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1
查看完整描述

3 回答

?
元芳怎么了

TA貢獻1798條經驗 獲得超7個贊

默認情況下,gorm 不會更新默認值(零)或 nil 值。如果您想控制它,請使用我在下面描述的東西。您可以使用 sql 包提供的可空類型或創建自己的類型。


type Model struct {

    Amount *sql.NullFloat64

}


// amount will not be updated

gorm.Updates(Model{Amount: nil})


// amount will be updated as a null

gorm.Updates(Model{Amount: &sql.NullFloat64{}})


// amount will be updated as a 10.50

gorm.Updates(Model{Amount: &sql.NullFloat64{Float64: 10.50, Valid: true}})


查看完整回答
1 反對 回復 2022-06-27
?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

time.Time結構內字段類型的零值或默認值是time.Time{}. 使用 時Updates,要么不填充CreatedAt字段,要么為其賦值time.Time{}。


CreatedAt在下面的示例中,在兩種情況下都為字段打印出默認值或零值。


package main


import (

    "fmt"

    "time"

)


type T struct {

   CreatedAt time.Time

   C int

   S string

}


func main() {

    fmt.Println(T{C: 1, S: "one"})

    fmt.Println(T{C: 2, S: "two", CreatedAt: time.Time{}})

}


// {0001-01-01 00:00:00 +0000 UTC 1 one}

// {0001-01-01 00:00:00 +0000 UTC 2 two} 

編輯:另外,如果字段是類型, 我不確定如何CreatedAt: nil,編譯,而不是.CreatedAttime.Time*time.Time


由于您已將Service結構和CreatedAt字段類型更新為*time.Time,因此以下應該可以工作:


tx.Model(&service).Updates(Service{Name: service.Name}) // add all fields that you want to be updated.


// resulting query

// UPDATE services SET name = 'new service name' WHERE id = 'abc123';

官方 GORM 示例在這里


此外,您可以像這樣省略該created_at字段:


tx.Model(&service).Omit("created_at").Updates(service)


查看完整回答
反對 回復 2022-06-27
?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

使用地圖 https://gorm.io/docs/update.html#Updates-multiple-columns

tx.Model(&service).Updates(map[string]interface{}{"ID": "abc123", "Name": "new service name", "CreatedAt": nil})



查看完整回答
反對 回復 2022-06-27
  • 3 回答
  • 0 關注
  • 973 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號