add method insert batch

This commit is contained in:
tangpanqing
2022-12-16 14:37:35 +08:00
parent 65c4e72007
commit 438f299d15
2 changed files with 89 additions and 0 deletions

54
crud.go
View File

@@ -2,6 +2,7 @@ package aorm
import (
"database/sql"
"errors"
"fmt"
"reflect"
"strings"
@@ -77,6 +78,59 @@ func (db *Executor) Insert(dest interface{}) (int64, error) {
return lastId, nil
}
// InsertBatch 批量增加记录
func (db *Executor) InsertBatch(values interface{}) (int64, error) {
var keys []string
var paramList []any
var place []string
valueOf := reflect.ValueOf(values).Elem()
if valueOf.Len() == 0 {
return 0, errors.New("the data list for insert batch not found")
}
typeOf := reflect.TypeOf(values).Elem().Elem()
//如果没有设置表名
if db.TableName == "" {
db.TableName = reflectTableName(typeOf, valueOf.Index(0))
}
for j := 0; j < valueOf.Len(); j++ {
var placeItem []string
for i := 0; i < valueOf.Index(j).NumField(); i++ {
isNotNull := valueOf.Index(j).Field(i).Field(0).Field(1).Bool()
if isNotNull {
if j == 0 {
key := UnderLine(typeOf.Field(i).Name)
keys = append(keys, key)
}
val := valueOf.Index(j).Field(i).Field(0).Field(0).Interface()
paramList = append(paramList, val)
placeItem = append(placeItem, "?")
}
}
place = append(place, "("+strings.Join(placeItem, ",")+")")
}
sqlStr := "INSERT INTO " + db.TableName + " (" + strings.Join(keys, ",") + ") VALUES " + strings.Join(place, ",")
res, err := db.Exec(sqlStr, paramList...)
if err != nil {
return 0, err
}
count, err := res.RowsAffected()
if err != nil {
return 0, err
}
return count, nil
}
// GetMany 查询记录(新)
func (db *Executor) GetMany(values interface{}) error {
sqlStr, paramList := db.getSqlAndParams()

View File

@@ -49,6 +49,8 @@ func TestAll(t *testing.T) {
testShowCreateTable(db)
id := testInsert(db)
testInsertBatch(db)
testGetOne(db, id)
testGetMany(db)
testUpdate(db, id)
@@ -150,6 +152,39 @@ func testInsert(db *sql.DB) int64 {
return id
}
func testInsertBatch(db *sql.DB) int64 {
fmt.Println("--- testInsertBatch ---")
var batch []Person
batch = append(batch, Person{
Name: aorm.StringFrom("Alice"),
Sex: aorm.BoolFrom(false),
Age: aorm.IntFrom(18),
Type: aorm.IntFrom(0),
CreateTime: aorm.TimeFrom(time.Now()),
Money: aorm.FloatFrom(100.15987654321),
Test: aorm.FloatFrom(200.15987654321987654321),
})
batch = append(batch, Person{
Name: aorm.StringFrom("Bob"),
Sex: aorm.BoolFrom(true),
Age: aorm.IntFrom(18),
Type: aorm.IntFrom(0),
CreateTime: aorm.TimeFrom(time.Now()),
Money: aorm.FloatFrom(100.15987654321),
Test: aorm.FloatFrom(200.15987654321987654321),
})
count, errInsertBatch := aorm.Use(db).Debug(true).InsertBatch(&batch)
if errInsertBatch != nil {
fmt.Println(errInsertBatch)
}
fmt.Println(count)
return count
}
func testGetOne(db *sql.DB, id int64) {
fmt.Println("--- testGetOne ---")