v0.0.383 sq.InsertMultiple
All checks were successful
Build Docker and Deploy / Run goext test-suite (push) Successful in 2m15s
All checks were successful
Build Docker and Deploy / Run goext test-suite (push) Successful in 2m15s
This commit is contained in:
@@ -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 {
|
||||
|
Reference in New Issue
Block a user