Add OnConflict DoUpdates test

This commit is contained in:
Jinzhu 2020-06-07 09:39:39 +08:00
parent 93043334c3
commit 82d55b1054
3 changed files with 31 additions and 5 deletions

View File

@ -14,8 +14,14 @@ func (OnConflict) Name() string {
// Build build onConflict clause // Build build onConflict clause
func (onConflict OnConflict) Build(builder Builder) { func (onConflict OnConflict) Build(builder Builder) {
if len(onConflict.Columns) > 0 { if len(onConflict.Columns) > 0 {
builder.WriteQuoted(onConflict.Columns) // FIXME columns builder.WriteByte('(')
builder.WriteByte(' ') for idx, column := range onConflict.Columns {
if idx > 0 {
builder.WriteByte(',')
}
builder.WriteQuoted(column)
}
builder.WriteString(`) `)
} }
if len(onConflict.Where.Exprs) > 0 { if len(onConflict.Where.Exprs) > 0 {

View File

@ -47,7 +47,7 @@ func Assignments(values map[string]interface{}) Set {
for _, key := range keys { for _, key := range keys {
assignments = append(assignments, Assignment{ assignments = append(assignments, Assignment{
Column: Column{Table: CurrentTable, Name: key}, Column: Column{Name: key},
Value: values[key], Value: values[key],
}) })
} }

View File

@ -10,10 +10,14 @@ import (
func TestUpsert(t *testing.T) { func TestUpsert(t *testing.T) {
lang := Language{Code: "upsert", Name: "Upsert"} lang := Language{Code: "upsert", Name: "Upsert"}
DB.Clauses(clause.OnConflict{DoNothing: true}).Create(&lang) if err := DB.Clauses(clause.OnConflict{DoNothing: true}).Create(&lang).Error; err != nil {
t.Fatalf("failed to upsert, got %v", err)
}
lang2 := Language{Code: "upsert", Name: "Upsert"} lang2 := Language{Code: "upsert", Name: "Upsert"}
DB.Clauses(clause.OnConflict{DoNothing: true}).Create(&lang2) if err := DB.Clauses(clause.OnConflict{DoNothing: true}).Create(&lang2).Error; err != nil {
t.Fatalf("failed to upsert, got %v", err)
}
var langs []Language var langs []Language
if err := DB.Find(&langs, "code = ?", lang.Code).Error; err != nil { if err := DB.Find(&langs, "code = ?", lang.Code).Error; err != nil {
@ -21,6 +25,22 @@ func TestUpsert(t *testing.T) {
} else if len(langs) != 1 { } else if len(langs) != 1 {
t.Errorf("should only find only 1 languages, but got %+v", langs) t.Errorf("should only find only 1 languages, but got %+v", langs)
} }
lang3 := Language{Code: "upsert", Name: "Upsert"}
if err := DB.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "code"}},
DoUpdates: clause.Assignments(map[string]interface{}{"name": "upsert-new"}),
}).Create(&lang3).Error; err != nil {
t.Fatalf("failed to upsert, got %v", err)
}
if err := DB.Find(&langs, "code = ?", lang.Code).Error; err != nil {
t.Errorf("no error should happen when find languages with code, but got %v", err)
} else if len(langs) != 1 {
t.Errorf("should only find only 1 languages, but got %+v", langs)
} else if langs[0].Name != "upsert-new" {
t.Errorf("should update name on conflict, but got name %+v", langs[0].Name)
}
} }
func TestUpsertSlice(t *testing.T) { func TestUpsertSlice(t *testing.T) {