mirror of https://github.com/go-gorm/gorm.git
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.Schema != nil {
|
||||
columns := make([]string, 0, len(stmt.Schema.DBNames)-1)
|
||||
for _, name := range stmt.Schema.DBNames {
|
||||
if field := stmt.Schema.LookUpField(name); field != nil {
|
||||
columns := make([]string, 0, len(values.Columns)-1)
|
||||
for _, column := range values.Columns {
|
||||
if field := stmt.Schema.LookUpField(column.Name); field != nil {
|
||||
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-2", Name: "Upsert-save-2"},
|
||||
}
|
||||
|
||||
if err := DB.Save(&langs).Error; err != nil {
|
||||
t.Errorf("Failed to create, got error %v", err)
|
||||
}
|
||||
|
@ -103,8 +104,52 @@ func TestUpsertWithSave(t *testing.T) {
|
|||
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)
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
|
|
Loading…
Reference in New Issue