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 }