package database import ( "bytes" "fmt" "strings" "sync" "text/template" ) var queriesCache sync.Map func BuildQuery(text string, data map[string]interface{}) (string, []interface{}, error) { var t *template.Template v, ok := queriesCache.Load(text) if !ok { var err error t, err = template.New("query").Parse(text) if err != nil { return "", nil, fmt.Errorf("could not parse sql query template: %w", err) } queriesCache.Store(text, t) } else { t = v.(*template.Template) } var wr bytes.Buffer if err := t.Execute(&wr, data); err != nil { return "", nil, fmt.Errorf("could not apply sql query data: %w", err) } query := wr.String() var args []interface{} for key, val := range data { if !strings.Contains(query, "@"+key) { continue } args = append(args, val) query = strings.Replace(query, "@"+key, fmt.Sprintf("$%d", len(args)), -1) } return query, args, nil }