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  }