mirror of https://github.com/go-gorm/gorm.git
If failed to update current record with Save, try to create a new one
This commit is contained in:
parent
446ce99a42
commit
02f6ae3c4e
10
main.go
10
main.go
|
@ -363,10 +363,14 @@ func (s *DB) UpdateColumns(values interface{}) *DB {
|
||||||
// Save update value in database, if the value doesn't have primary key, will insert it
|
// Save update value in database, if the value doesn't have primary key, will insert it
|
||||||
func (s *DB) Save(value interface{}) *DB {
|
func (s *DB) Save(value interface{}) *DB {
|
||||||
scope := s.clone().NewScope(value)
|
scope := s.clone().NewScope(value)
|
||||||
if scope.PrimaryKeyZero() {
|
if !scope.PrimaryKeyZero() {
|
||||||
return scope.callCallbacks(s.parent.callbacks.creates).db
|
newDB := scope.callCallbacks(s.parent.callbacks.updates).db
|
||||||
|
if newDB.Error == nil && newDB.RowsAffected == 0 {
|
||||||
|
return s.New().FirstOrCreate(value)
|
||||||
}
|
}
|
||||||
return scope.callCallbacks(s.parent.callbacks.updates).db
|
return newDB
|
||||||
|
}
|
||||||
|
return scope.callCallbacks(s.parent.callbacks.creates).db
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create insert the value into database
|
// Create insert the value into database
|
||||||
|
|
10
main_test.go
10
main_test.go
|
@ -81,10 +81,16 @@ func TestStringPrimaryKey(t *testing.T) {
|
||||||
ID string `gorm:"primary_key"`
|
ID string `gorm:"primary_key"`
|
||||||
Name string
|
Name string
|
||||||
}
|
}
|
||||||
|
DB.DropTable(&UUIDStruct{})
|
||||||
DB.AutoMigrate(&UUIDStruct{})
|
DB.AutoMigrate(&UUIDStruct{})
|
||||||
|
|
||||||
data := UUIDStruct{ID: "uuid", Name: "hello"}
|
data := UUIDStruct{ID: "uuid", Name: "hello"}
|
||||||
if err := DB.Save(&data).Error; err != nil || data.ID != "uuid" {
|
if err := DB.Save(&data).Error; err != nil || data.ID != "uuid" || data.Name != "hello" {
|
||||||
|
t.Errorf("string primary key should not be populated")
|
||||||
|
}
|
||||||
|
|
||||||
|
data = UUIDStruct{ID: "uuid", Name: "hello world"}
|
||||||
|
if err := DB.Save(&data).Error; err != nil || data.ID != "uuid" || data.Name != "hello world" {
|
||||||
t.Errorf("string primary key should not be populated")
|
t.Errorf("string primary key should not be populated")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -541,7 +547,7 @@ func TestJoins(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var users5 []User
|
var users5 []User
|
||||||
db5 := DB.Joins("join emails on emails.user_id = users.id AND emails.email = ?", "join1@example.com").Joins("join credit_cards on credit_cards.user_id = users.id AND credit_cards.number = ?", "411111111111").Where(User{Id:1}).Where(Email{Id:1}).Not(Email{Id:10}).First(&users5)
|
db5 := DB.Joins("join emails on emails.user_id = users.id AND emails.email = ?", "join1@example.com").Joins("join credit_cards on credit_cards.user_id = users.id AND credit_cards.number = ?", "411111111111").Where(User{Id: 1}).Where(Email{Id: 1}).Not(Email{Id: 10}).First(&users5)
|
||||||
if db5.Error != nil {
|
if db5.Error != nil {
|
||||||
t.Errorf("Should not raise error for join where identical fields in different tables. Error: %s", db5.Error.Error())
|
t.Errorf("Should not raise error for join where identical fields in different tables. Error: %s", db5.Error.Error())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue