zhanghelong 2018-11-13 23:23:12 +08:00
parent b07c406703
commit 6b3b18733a
2 changed files with 61 additions and 1 deletions

View File

@ -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...)

View File

@ -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