This commit is contained in:
2022-04-07 15:20:21 +08:00
parent 19ea9c5a16
commit 811536bea4
35 changed files with 466 additions and 543 deletions

16
pkg/database/mssql.go Normal file
View File

@@ -0,0 +1,16 @@
package database
import (
mssql "github.com/denisenkom/go-mssqldb"
)
// MSIsUniqueViolation 唯一值是否冲突 ture: 是, false: 否
func MSIsUniqueViolation(err error) bool {
msErr, ok := err.(mssql.Error)
return ok && msErr.Number == 2627
}
//func MsIsForeignKeyViolation(err error) bool {
// msErr, ok := err.(mssql.Error)
// return ok && msErr.Number == 0
//}

15
pkg/database/postgres.go Normal file
View File

@@ -0,0 +1,15 @@
package database
import (
"github.com/lib/pq"
)
func PGIsUniqueViolation(err error) bool {
pqErr, ok := err.(*pq.Error)
return ok && pqErr.Code == "23505"
}
func PGIsForeignKeyViolation(err error) bool {
pqErr, ok := err.(*pq.Error)
return ok && pqErr.Code == "23503"
}

44
pkg/database/query.go Normal file
View File

@@ -0,0 +1,44 @@
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
}