2025-03-21 11:05:42 +08:00

45 lines
885 B
Go

package db
import (
"bytes"
"fmt"
"strings"
"sync"
"text/template"
)
var queriesCache sync.Map
func BuildQuery(text string, data map[string]any) (string, []any, 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()
args := []any{}
for key, val := range data {
if !strings.Contains(query, "@"+key) {
continue
}
args = append(args, val)
query = strings.ReplaceAll(query, "@"+key, fmt.Sprintf("$%d", len(args)))
}
return query, args, nil
}