support delete with no bean

This commit is contained in:
Lunny Xiao 2020-06-18 18:05:25 +08:00
parent 43977186d3
commit 286a929433
2 changed files with 49 additions and 13 deletions

View File

@ -241,3 +241,28 @@ func TestUnscopeDelete(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.False(t, has) assert.False(t, has)
} }
func TestDelete2(t *testing.T) {
assert.NoError(t, PrepareEngine())
type UserinfoDelete2 struct {
Uid int64 `xorm:"id pk not null autoincr"`
IsMan bool
}
assert.NoError(t, testEngine.Sync2(new(UserinfoDelete2)))
user := UserinfoDelete2{}
cnt, err := testEngine.Insert(&user)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
cnt, err = testEngine.Table("userinfo_delete2").In("id", []int{1}).Delete()
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
user2 := UserinfoDelete2{}
has, err := testEngine.ID(1).Get(&user2)
assert.NoError(t, err)
assert.False(t, has)
}

View File

@ -83,7 +83,7 @@ func (session *Session) cacheDelete(table *schemas.Table, tableName, sqlStr stri
} }
// Delete records, bean's non-empty fields are conditions // Delete records, bean's non-empty fields are conditions
func (session *Session) Delete(bean interface{}) (int64, error) { func (session *Session) Delete(beans ...interface{}) (int64, error) {
if session.isAutoClose { if session.isAutoClose {
defer session.Close() defer session.Close()
} }
@ -92,7 +92,14 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
return 0, session.statement.LastError return 0, session.statement.LastError
} }
if err := session.statement.SetRefBean(bean); err != nil { var (
condSQL string
condArgs []interface{}
err error
)
if len(beans) > 0 {
bean := beans[0]
if err = session.statement.SetRefBean(bean); err != nil {
return 0, err return 0, err
} }
@ -102,10 +109,14 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
processor.BeforeDelete() processor.BeforeDelete()
} }
condSQL, condArgs, err := session.statement.GenConds(bean) condSQL, condArgs, err = session.statement.GenConds(bean)
} else {
condSQL, condArgs, err = session.statement.GenCondSQL(session.statement.Conds())
}
if err != nil { if err != nil {
return 0, err return 0, err
} }
pLimitN := session.statement.LimitN pLimitN := session.statement.LimitN
if len(condSQL) == 0 && (pLimitN == nil || *pLimitN == 0) { if len(condSQL) == 0 && (pLimitN == nil || *pLimitN == 0) {
return 0, ErrNeedDeletedCond return 0, ErrNeedDeletedCond
@ -230,8 +241,8 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
} }
} else { } else {
lenAfterClosures := len(session.afterClosures) lenAfterClosures := len(session.afterClosures)
if lenAfterClosures > 0 { if lenAfterClosures > 0 && len(beans) > 0 {
if value, has := session.afterDeleteBeans[bean]; has && value != nil { if value, has := session.afterDeleteBeans[beans[0]]; has && value != nil {
*value = append(*value, session.afterClosures...) *value = append(*value, session.afterClosures...)
} else { } else {
afterClosures := make([]func(interface{}), lenAfterClosures) afterClosures := make([]func(interface{}), lenAfterClosures)