2022-04-07 15:20:21 +08:00

45 lines
915 B
Go

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
}