0.0.3
This commit is contained in:
16
pkg/database/mssql.go
Normal file
16
pkg/database/mssql.go
Normal 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
15
pkg/database/postgres.go
Normal 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
44
pkg/database/query.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user