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:
@@ -1,13 +1,14 @@
|
||||
package sq
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"gogs.mikescher.com/BlackForestBytes/goext/exerr"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func BuildUpdateStatement(q Queryable, tableName string, obj any, idColumn string) (string, PP, error) {
|
||||
func BuildUpdateStatement[TData any](q Queryable, tableName string, obj TData, idColumn string) (string, PP, error) {
|
||||
rval := reflect.ValueOf(obj)
|
||||
rtyp := rval.Type()
|
||||
|
||||
@@ -70,7 +71,7 @@ func BuildUpdateStatement(q Queryable, tableName string, obj any, idColumn strin
|
||||
return fmt.Sprintf("UPDATE %s SET %s WHERE %s", tableName, strings.Join(setClauses, ", "), matchClause), params, nil
|
||||
}
|
||||
|
||||
func BuildInsertStatement(q Queryable, tableName string, obj any) (string, PP, error) {
|
||||
func BuildInsertStatement[TData any](q Queryable, tableName string, obj TData) (string, PP, error) {
|
||||
rval := reflect.ValueOf(obj)
|
||||
rtyp := rval.Type()
|
||||
|
||||
@@ -118,3 +119,81 @@ func BuildInsertStatement(q Queryable, tableName string, obj any) (string, PP, e
|
||||
//goland:noinspection SqlNoDataSourceInspection
|
||||
return fmt.Sprintf("INSERT INTO %s (%s) VALUES (%s)", tableName, strings.Join(fields, ", "), strings.Join(values, ", ")), params, nil
|
||||
}
|
||||
|
||||
func BuildInsertMultipleStatement[TData any](q Queryable, tableName string, vArr []TData) (string, PP, error) {
|
||||
|
||||
if len(vArr) == 0 {
|
||||
return "", nil, errors.New("no data supplied")
|
||||
}
|
||||
|
||||
rtyp := reflect.ValueOf(vArr[0]).Type()
|
||||
|
||||
sqlPrefix := ""
|
||||
{
|
||||
columns := make([]string, 0)
|
||||
|
||||
for i := 0; i < rtyp.NumField(); i++ {
|
||||
rsfield := rtyp.Field(i)
|
||||
|
||||
if !rsfield.IsExported() {
|
||||
continue
|
||||
}
|
||||
|
||||
columnName := rsfield.Tag.Get("db")
|
||||
if columnName == "" || columnName == "-" {
|
||||
continue
|
||||
}
|
||||
|
||||
columns = append(columns, "\""+columnName+"\"")
|
||||
}
|
||||
|
||||
sqlPrefix = fmt.Sprintf("INSERT"+" INTO \"%s\" (%s) VALUES", tableName, strings.Join(columns, ", "))
|
||||
}
|
||||
|
||||
pp := PP{}
|
||||
|
||||
sqlValuesArr := make([]string, 0)
|
||||
|
||||
for _, v := range vArr {
|
||||
|
||||
rval := reflect.ValueOf(v)
|
||||
|
||||
params := make([]string, 0)
|
||||
|
||||
for i := 0; i < rtyp.NumField(); i++ {
|
||||
|
||||
rsfield := rtyp.Field(i)
|
||||
rvfield := rval.Field(i)
|
||||
|
||||
if !rsfield.IsExported() {
|
||||
continue
|
||||
}
|
||||
|
||||
columnName := rsfield.Tag.Get("db")
|
||||
if columnName == "" || columnName == "-" {
|
||||
continue
|
||||
}
|
||||
|
||||
if rsfield.Type.Kind() == reflect.Ptr && rvfield.IsNil() {
|
||||
|
||||
params = append(params, "NULL")
|
||||
|
||||
} else {
|
||||
|
||||
val, err := convertValueToDB(q, rvfield.Interface())
|
||||
if err != nil {
|
||||
return "", nil, err
|
||||
}
|
||||
|
||||
params = append(params, ":"+pp.Add(val))
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
sqlValuesArr = append(sqlValuesArr, fmt.Sprintf("(%s)", strings.Join(params, ", ")))
|
||||
}
|
||||
|
||||
sqlstr := fmt.Sprintf("%s %s", sqlPrefix, strings.Join(sqlValuesArr, ", "))
|
||||
|
||||
return sqlstr, pp, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user