Upsert selected columns
This commit is contained in:
		
							parent
							
								
									f3424c6864
								
							
						
					
					
						commit
						0d58d5a3a7
					
				| @ -278,11 +278,11 @@ func ConvertToCreateValues(stmt *gorm.Statement) (values clause.Values) { | |||||||
| 
 | 
 | ||||||
| 	if stmt.UpdatingColumn { | 	if stmt.UpdatingColumn { | ||||||
| 		if stmt.Schema != nil { | 		if stmt.Schema != nil { | ||||||
| 			columns := make([]string, 0, len(stmt.Schema.DBNames)-1) | 			columns := make([]string, 0, len(values.Columns)-1) | ||||||
| 			for _, name := range stmt.Schema.DBNames { | 			for _, column := range values.Columns { | ||||||
| 				if field := stmt.Schema.LookUpField(name); field != nil { | 				if field := stmt.Schema.LookUpField(column.Name); field != nil { | ||||||
| 					if !field.PrimaryKey && !field.HasDefaultValue && field.AutoCreateTime == 0 { | 					if !field.PrimaryKey && !field.HasDefaultValue && field.AutoCreateTime == 0 { | ||||||
| 						columns = append(columns, name) | 						columns = append(columns, column.Name) | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  | |||||||
| @ -95,6 +95,7 @@ func TestUpsertWithSave(t *testing.T) { | |||||||
| 		{Code: "upsert-save-1", Name: "Upsert-save-1"}, | 		{Code: "upsert-save-1", Name: "Upsert-save-1"}, | ||||||
| 		{Code: "upsert-save-2", Name: "Upsert-save-2"}, | 		{Code: "upsert-save-2", Name: "Upsert-save-2"}, | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	if err := DB.Save(&langs).Error; err != nil { | 	if err := DB.Save(&langs).Error; err != nil { | ||||||
| 		t.Errorf("Failed to create, got error %v", err) | 		t.Errorf("Failed to create, got error %v", err) | ||||||
| 	} | 	} | ||||||
| @ -103,8 +104,52 @@ func TestUpsertWithSave(t *testing.T) { | |||||||
| 		var result Language | 		var result Language | ||||||
| 		if err := DB.First(&result, "code = ?", lang.Code).Error; err != nil { | 		if err := DB.First(&result, "code = ?", lang.Code).Error; err != nil { | ||||||
| 			t.Errorf("Failed to query lang, got error %v", err) | 			t.Errorf("Failed to query lang, got error %v", err) | ||||||
|  | 		} else { | ||||||
|  | 			AssertEqual(t, result, lang) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	for idx, lang := range langs { | ||||||
|  | 		lang.Name += "_new" | ||||||
|  | 		langs[idx] = lang | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := DB.Save(&langs).Error; err != nil { | ||||||
|  | 		t.Errorf("Failed to upsert, got error %v", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, lang := range langs { | ||||||
|  | 		var result Language | ||||||
|  | 		if err := DB.First(&result, "code = ?", lang.Code).Error; err != nil { | ||||||
|  | 			t.Errorf("Failed to query lang, got error %v", err) | ||||||
|  | 		} else { | ||||||
|  | 			AssertEqual(t, result, lang) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// lang := Language{Code: "upsert-save-3", Name: "Upsert-save-3"}
 | ||||||
|  | 	// if err := DB.Save(&lang).Error; err != nil {
 | ||||||
|  | 	// 	t.Errorf("Failed to create, got error %v", err)
 | ||||||
|  | 	// }
 | ||||||
|  | 
 | ||||||
|  | 	// var result Language
 | ||||||
|  | 	// if err := DB.First(&result, "code = ?", lang.Code).Error; err != nil {
 | ||||||
|  | 	// 	t.Errorf("Failed to query lang, got error %v", err)
 | ||||||
|  | 	// } else {
 | ||||||
|  | 	// 	AssertEqual(t, result, lang)
 | ||||||
|  | 	// }
 | ||||||
|  | 
 | ||||||
|  | 	// lang.Name += "_new"
 | ||||||
|  | 	// if err := DB.Save(&lang).Error; err != nil {
 | ||||||
|  | 	// 	t.Errorf("Failed to create, got error %v", err)
 | ||||||
|  | 	// }
 | ||||||
|  | 
 | ||||||
|  | 	// var result2 Language
 | ||||||
|  | 	// if err := DB.First(&result2, "code = ?", lang.Code).Error; err != nil {
 | ||||||
|  | 	// 	t.Errorf("Failed to query lang, got error %v", err)
 | ||||||
|  | 	// } else {
 | ||||||
|  | 	// 	AssertEqual(t, result2, lang)
 | ||||||
|  | 	// }
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestFindOrInitialize(t *testing.T) { | func TestFindOrInitialize(t *testing.T) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu