使用gorm時,主鍵爲空值時遇到的問題

問題描述:

最近在使用gorm時,發現db文件在某些情況下會多出來幾行重複的數據。

type Sip struct {
	SipPoolID uint
	Sip string `json:"-" gorm:"primary_key"`
	NetSegment string `json:"-" gorm:"primary_key"`
}

使用以上結構體,通過gorm創建出來的表會出現如下情況:

診斷:

經過一番操作和觀察,發現在某行數據主鍵爲空值的時候,這行數據會重複出現。然後去看源碼,發現了這麼一段代碼:

// Save update value in database, if the value doesn't have primary key, will insert it
func (s *DB) Save(value interface{}) *DB {
	scope := s.NewScope(value)
	if !scope.PrimaryKeyZero() {
		newDB := scope.callCallbacks(s.parent.callbacks.updates).db
		if newDB.Error == nil && newDB.RowsAffected == 0 {
			return s.New().FirstOrCreate(value)
		}
		return newDB
	}
	return scope.callCallbacks(s.parent.callbacks.creates).db
}

原因:

在保存數據時,如果發現主鍵爲空值時,會去insert這條數據,但其實這條數據已經存在,於是就多出來了一條。對於這個問題作者給出的解釋是,正常情況下主鍵不應該爲空,那如果像我這樣需要複合主鍵,且有一個主鍵是會有空值的情況怎麼辦呢?作者給出一個解決方法:使用指針!比如我這個可能爲空的主鍵現在是string,那麼可以設置爲*string,這樣當鍵值爲空字符串時,指針也不是nil,即指針不是一個空值,就不會出現這樣的問題啦。

相關issue:https://github.com/jinzhu/gorm/issues/1778

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章