diff --git a/session_insert.go b/session_insert.go index 923fe16c..3a0a7066 100644 --- a/session_insert.go +++ b/session_insert.go @@ -122,7 +122,13 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error for i := 0; i < size; i++ { v := sliceValue.Index(i) - vv := reflect.Indirect(v) + var vv reflect.Value + switch v.Kind() { + case reflect.Interface: + vv = reflect.Indirect(v.Elem()) + default: + vv = reflect.Indirect(v) + } elemValue := v.Interface() var colPlaces []string diff --git a/session_insert_test.go b/session_insert_test.go index 09f647b8..3bc2d5b1 100644 --- a/session_insert_test.go +++ b/session_insert_test.go @@ -433,6 +433,37 @@ func TestInsertMulti2(t *testing.T) { assert.EqualValues(t, len(users2), cnt) } +func TestInsertMulti2Interface(t *testing.T) { + assert.NoError(t, prepareEngine()) + + assertSync(t, new(Userinfo)) + + users := []interface{}{ + Userinfo{Username: "xlw", Departname: "dev", Alias: "lunny2", Created: time.Now()}, + Userinfo{Username: "xlw2", Departname: "dev", Alias: "lunny3", Created: time.Now()}, + Userinfo{Username: "xlw11", Departname: "dev", Alias: "lunny2", Created: time.Now()}, + Userinfo{Username: "xlw22", Departname: "dev", Alias: "lunny3", Created: time.Now()}, + } + + cnt, err := testEngine.Insert(&users) + if err != nil { + t.Error(err) + panic(err) + } + assert.EqualValues(t, len(users), cnt) + + users2 := []interface{}{ + &Userinfo{Username: "1xlw", Departname: "dev", Alias: "lunny2", Created: time.Now()}, + &Userinfo{Username: "1xlw2", Departname: "dev", Alias: "lunny3", Created: time.Now()}, + &Userinfo{Username: "1xlw11", Departname: "dev", Alias: "lunny2", Created: time.Now()}, + &Userinfo{Username: "1xlw22", Departname: "dev", Alias: "lunny3", Created: time.Now()}, + } + + cnt, err = testEngine.Insert(&users2) + assert.NoError(t, err) + assert.EqualValues(t, len(users2), cnt) +} + func TestInsertTwoTable(t *testing.T) { assert.NoError(t, prepareEngine())