github.com/Ali-iotechsys/sqlboiler/v4@v4.0.0-20221208124957-6aec9a5f1f71/drivers/sqlboiler-psql/driver/override/main/singleton/psql_upsert.go.tpl (about)

     1  // buildUpsertQueryPostgres builds a SQL statement string using the upsertData provided.
     2  func buildUpsertQueryPostgres(dia drivers.Dialect, tableName string, updateOnConflict bool, ret, update, conflict, whitelist []string) string {
     3  	conflict = strmangle.IdentQuoteSlice(dia.LQ, dia.RQ, conflict)
     4  	whitelist = strmangle.IdentQuoteSlice(dia.LQ, dia.RQ, whitelist)
     5  	ret = strmangle.IdentQuoteSlice(dia.LQ, dia.RQ, ret)
     6  
     7  	buf := strmangle.GetBuffer()
     8  	defer strmangle.PutBuffer(buf)
     9  
    10  	columns := "DEFAULT VALUES"
    11  	if len(whitelist) != 0 {
    12  		columns = fmt.Sprintf("(%s) VALUES (%s)",
    13  			strings.Join(whitelist, ", "),
    14  			strmangle.Placeholders(dia.UseIndexPlaceholders, len(whitelist), 1, 1))
    15  	}
    16  
    17  	fmt.Fprintf(
    18  		buf,
    19  		"INSERT INTO %s %s ON CONFLICT ",
    20  		tableName,
    21  		columns,
    22  	)
    23  
    24  	if !updateOnConflict || len(update) == 0 {
    25  		buf.WriteString("DO NOTHING")
    26  	} else {
    27  		buf.WriteByte('(')
    28  		buf.WriteString(strings.Join(conflict, ", "))
    29  		buf.WriteString(") DO UPDATE SET ")
    30  
    31  		for i, v := range update {
    32  			if i != 0 {
    33  				buf.WriteByte(',')
    34  			}
    35  			quoted := strmangle.IdentQuote(dia.LQ, dia.RQ, v)
    36  			buf.WriteString(quoted)
    37  			buf.WriteString(" = EXCLUDED.")
    38  			buf.WriteString(quoted)
    39  		}
    40  	}
    41  
    42  	if len(ret) != 0 {
    43  		buf.WriteString(" RETURNING ")
    44  		buf.WriteString(strings.Join(ret, ", "))
    45  	}
    46  
    47  	return buf.String()
    48  }