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.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
func (session *Session) Delete(bean interface{}) (int64, error) {
func (session *Session) Delete(beans ...interface{}) (int64, error) {
if session.isAutoClose {
defer session.Close()
}
@ -92,7 +92,14 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
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
}
@ -102,10 +109,14 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
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 {
return 0, err
}
pLimitN := session.statement.LimitN
if len(condSQL) == 0 && (pLimitN == nil || *pLimitN == 0) {
return 0, ErrNeedDeletedCond
@ -230,8 +241,8 @@ func (session *Session) Delete(bean interface{}) (int64, error) {
}
} else {
lenAfterClosures := len(session.afterClosures)
if lenAfterClosures > 0 {
if value, has := session.afterDeleteBeans[bean]; has && value != nil {
if lenAfterClosures > 0 && len(beans) > 0 {
if value, has := session.afterDeleteBeans[beans[0]]; has && value != nil {
*value = append(*value, session.afterClosures...)
} else {
afterClosures := make([]func(interface{}), lenAfterClosures)