v0.0.383 sq.InsertMultiple
All checks were successful
Build Docker and Deploy / Run goext test-suite (push) Successful in 2m15s

This commit is contained in:
2024-02-09 15:17:51 +01:00
parent 885bb53244
commit 30ce8c4b60
7 changed files with 423 additions and 29 deletions

View File

@@ -4,10 +4,9 @@ import (
"context"
"database/sql"
"errors"
"fmt"
"github.com/jmoiron/sqlx"
"reflect"
"strings"
"gogs.mikescher.com/BlackForestBytes/goext/exerr"
"gogs.mikescher.com/BlackForestBytes/goext/langext"
)
type StructScanMode string
@@ -26,42 +25,61 @@ const (
func InsertSingle[TData any](ctx context.Context, q Queryable, tableName string, v TData) (sql.Result, error) {
rval := reflect.ValueOf(v)
rtyp := rval.Type()
sqlstr, pp, err := BuildInsertStatement(q, tableName, v)
if err != nil {
return nil, err
}
columns := make([]string, 0)
params := make([]string, 0)
pp := PP{}
sqlr, err := q.Exec(ctx, sqlstr, pp)
if err != nil {
return nil, err
}
for i := 0; i < rtyp.NumField(); i++ {
return sqlr, nil
}
rsfield := rtyp.Field(i)
rvfield := rval.Field(i)
func InsertMultiple[TData any](ctx context.Context, q Queryable, tableName string, vArr []TData, maxBatch int) ([]sql.Result, error) {
if !rsfield.IsExported() {
continue
if len(vArr) == 0 {
return make([]sql.Result, 0), nil
}
chunks := langext.ArrChunk(vArr, maxBatch)
sqlstrArr := make([]string, 0)
ppArr := make([]PP, 0)
for _, chunk := range chunks {
sqlstr, pp, err := BuildInsertMultipleStatement(q, tableName, chunk)
if err != nil {
return nil, exerr.Wrap(err, "").Build()
}
columnName := rsfield.Tag.Get("db")
if columnName == "" || columnName == "-" {
continue
}
sqlstrArr = append(sqlstrArr, sqlstr)
ppArr = append(ppArr, pp)
}
paramkey := fmt.Sprintf("_%s", columnName)
res := make([]sql.Result, 0, len(sqlstrArr))
columns = append(columns, "\""+columnName+"\"")
params = append(params, ":"+paramkey)
val, err := convertValueToDB(q, rvfield.Interface())
for i := 0; i < len(sqlstrArr); i++ {
sqlr, err := q.Exec(ctx, sqlstrArr[i], ppArr[i])
if err != nil {
return nil, err
}
pp[paramkey] = val
res = append(res, sqlr)
}
sqlstr := fmt.Sprintf("INSERT"+" INTO \"%s\" (%s) VALUES (%s)", tableName, strings.Join(columns, ", "), strings.Join(params, ", "))
return res, nil
}
func UpdateSingle[TData any](ctx context.Context, q Queryable, tableName string, v TData, idColumn string) (sql.Result, error) {
sqlstr, pp, err := BuildUpdateStatement(q, tableName, v, idColumn)
if err != nil {
return nil, err
}
sqlr, err := q.Exec(ctx, sqlstr, pp)
if err != nil {