5 回答

TA貢獻1951條經(jīng)驗 獲得超3個贊
// Update attributes with `struct`, will only update non-zero fields
db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})
// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 > 21:34:10' WHERE id = 111;
// Update attributes with `map`
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
// UPDATE users SET name='hello', age=18, actived=false, updated_at='2013-11-17 21:34:10' WHERE id=111;
注意當使用struct更新時,GORM只會更新非零字段,您可能想使用map更新屬性或使用Select指定要更新的字段
解決了:
if err := service.DB.Model(&attendee).Updates(map[string]interface{}{
? ? "Email":? ? ? ? ? attendee.Email,
? ? "ShowDirectory": false
}).Error; err != nil {
? ? return Attendee{}, err
}

TA貢獻1862條經(jīng)驗 獲得超7個贊
另一種方便的方法是將該字段設(shè)置為指針。
注意所有具有零值的字段,如 0、''、false 或其他零值,都不會保存到數(shù)據(jù)庫中,但會使用其默認值。如果您想避免這種情況,請考慮使用指針類型或掃描儀/估價器
在您的情況下,模型將如下所示:
type Attendee struct {
? ? ? ? ID? ? ? ? ? ? ?uint? ?`gorm:"primary_key" gorm:"AUTO_INCREMENT" json:"id,omitempty" mapstructure:"id" csv:"ID"`
? ? ? ? Email? ? ? ? ? string `json:"email,omitempty" mapstructure:"email" csv:"Email,required"`
? ??
? ? ? ? ShowDirectory? *bool? ?`json:"show_directory,omitempty" gorm:"default:true" mapstructure:"show_directory" csv:"-"`
}

TA貢獻1770條經(jīng)驗 獲得超3個贊
正如文檔中提到的,要設(shè)置虛假值,您需要使用map或選擇所需的列。
當使用struct更新時,GORM只會更新非零字段,您可能需要使用map來更新屬性或使用Select來指定要更新的字段
// Select with Struct (select zero value fields)
db.Model(&user).Select("Name", "Age").Updates(User{Name: "new_name", Age: 0})
// UPDATE users SET name='new_name', age=0 WHERE id=111;
或者您可以選擇所有列:
// Select all fields (select all fields include zero value fields)
db.Model(&user).Select("*").Update(User{Name: "jinzhu", Role: "admin", Age: 0})

TA貢獻1934條經(jīng)驗 獲得超2個贊
請不要使用 go struct 來更新非零字段,例如 boolean:false
下面的代碼不會Active: false在你的數(shù)據(jù)庫中更新,gorm 會忽略
db.Model(&user).Updates(User{Name: "hello", Age: 18, Active: false})
// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;
下面的代碼將更新Active: false
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18, "actived": false})
// UPDATE users SET name='hello', age=18, actived=false, updated_at='2013-11-17 21:34:10' WHERE id=111;
使用 Map 而不是 go struct

TA貢獻1865條經(jīng)驗 獲得超7個贊
您應該在結(jié)構(gòu)中編寫 gorm 類型,如下所示: gorm:"type:boolean; column:column_name"
并且它肯定會起作用!
- 5 回答
- 0 關(guān)注
- 778 瀏覽
添加回答
舉報