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.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…
Reference in New Issue