From 6b3b18733af0b1ec3e7258aa6f4d2022283a429d Mon Sep 17 00:00:00 2001 From: zhanghelong Date: Tue, 13 Nov 2018 23:23:12 +0800 Subject: [PATCH] fix https://github.com/go-xorm/xorm/issues/1143 --- session_insert.go | 17 +++++++++++++++- session_insert_test.go | 45 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/session_insert.go b/session_insert.go index e673e874..1b6580c7 100644 --- a/session_insert.go +++ b/session_insert.go @@ -23,6 +23,16 @@ func (session *Session) Insert(beans ...interface{}) (int64, error) { defer session.Close() } + var copyOfOmitColMap columnMap + var copyOfOmitStr string + + if len(session.statement.omitColumnMap) > 0 { + copyOfOmitColMap = make([]string, len(session.statement.omitColumnMap)) + copy(copyOfOmitColMap, session.statement.omitColumnMap) + + copyOfOmitStr = session.statement.OmitStr + } + for _, bean := range beans { sliceValue := reflect.Indirect(reflect.ValueOf(bean)) if sliceValue.Kind() == reflect.Slice { @@ -45,6 +55,11 @@ func (session *Session) Insert(beans ...interface{}) (int64, error) { } } } else { + if len(copyOfOmitColMap) > 0 { + session.statement.omitColumnMap = copyOfOmitColMap + session.statement.OmitStr = copyOfOmitStr + } + cnt, err := session.innerInsert(bean) if err != nil { return affected, err @@ -424,7 +439,7 @@ func (session *Session) innerInsert(bean interface{}) (int64, error) { return 1, nil } else if session.engine.dialect.DBType() == core.POSTGRES && len(table.AutoIncrement) > 0 { - //assert table.AutoIncrement != "" + // assert table.AutoIncrement != "" sqlStr = sqlStr + " RETURNING " + session.engine.Quote(table.AutoIncrement) res, err := session.queryBytes(sqlStr, args...) diff --git a/session_insert_test.go b/session_insert_test.go index 50943032..e10fa98b 100644 --- a/session_insert_test.go +++ b/session_insert_test.go @@ -46,6 +46,51 @@ func TestInsertMulti(t *testing.T) { assert.EqualValues(t, 3, num) } +func TestInsertMultiWithOmit(t *testing.T) { + assert.NoError(t, prepareEngine()) + + type TestMultiOmit struct { + Id int64 `xorm:"int(11) pk"` + Name string `xorm:"varchar(255)"` + Omitted string `xorm:"varchar(255) 'omitted'"` + } + + assert.NoError(t, testEngine.Sync2(new(TestMultiOmit))) + + l := []interface{}{ + TestMultiOmit{Id: 1, Name: "1", Omitted: "1"}, + TestMultiOmit{Id: 2, Name: "1", Omitted: "2"}, + TestMultiOmit{Id: 3, Name: "1", Omitted: "3"}, + } + + check := func() { + var ls []TestMultiOmit + err := testEngine.NewSession().Find(&ls) + assert.NoError(t, err) + assert.EqualValues(t, 3, len(ls)) + + for e := range ls { + assert.EqualValues(t, "", ls[e].Omitted) + } + } + + num, err := testEngine.NewSession().Omit("omitted"). + Insert(l ...) + assert.NoError(t, err) + assert.EqualValues(t, 3, num) + check() + + num, err = testEngine.NewSession().Delete(TestMultiOmit{Name: "1"}) + assert.NoError(t, err) + assert.EqualValues(t, 3, num) + + num, err = testEngine.NewSession().Omit("omitted"). + Insert(l) + assert.NoError(t, err) + assert.EqualValues(t, 3, num) + check() +} + func insertMultiDatas(step int, datas interface{}) (num int64, err error) { sliceValue := reflect.Indirect(reflect.ValueOf(datas)) var iLen int64