github.com/systematiccaos/gorm@v1.22.6/clause/on_conflict.go (about) 1 package clause 2 3 type OnConflict struct { 4 Columns []Column 5 Where Where 6 TargetWhere Where 7 OnConstraint string 8 DoNothing bool 9 DoUpdates Set 10 UpdateAll bool 11 } 12 13 func (OnConflict) Name() string { 14 return "ON CONFLICT" 15 } 16 17 // Build build onConflict clause 18 func (onConflict OnConflict) Build(builder Builder) { 19 if len(onConflict.Columns) > 0 { 20 builder.WriteByte('(') 21 for idx, column := range onConflict.Columns { 22 if idx > 0 { 23 builder.WriteByte(',') 24 } 25 builder.WriteQuoted(column) 26 } 27 builder.WriteString(`) `) 28 } 29 30 if len(onConflict.TargetWhere.Exprs) > 0 { 31 builder.WriteString(" WHERE ") 32 onConflict.TargetWhere.Build(builder) 33 builder.WriteByte(' ') 34 } 35 36 if onConflict.OnConstraint != "" { 37 builder.WriteString("ON CONSTRAINT ") 38 builder.WriteString(onConflict.OnConstraint) 39 builder.WriteByte(' ') 40 } 41 42 if onConflict.DoNothing { 43 builder.WriteString("DO NOTHING") 44 } else { 45 builder.WriteString("DO UPDATE SET ") 46 onConflict.DoUpdates.Build(builder) 47 } 48 49 if len(onConflict.Where.Exprs) > 0 { 50 builder.WriteString(" WHERE ") 51 onConflict.Where.Build(builder) 52 builder.WriteByte(' ') 53 } 54 } 55 56 // MergeClause merge onConflict clauses 57 func (onConflict OnConflict) MergeClause(clause *Clause) { 58 clause.Expression = onConflict 59 }