This commit is contained in:
Lunny Xiao 2017-03-27 18:14:40 +08:00
parent 5789833408
commit 08956a4864
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
3 changed files with 77 additions and 38 deletions

View File

@ -262,39 +262,40 @@ func (session *Session) Update(bean interface{}, condiBean ...interface{}) (int6
} }
cond = cond.And(builder.Eq{session.Engine.Quote(table.Version): verValue.Interface()}) cond = cond.And(builder.Eq{session.Engine.Quote(table.Version): verValue.Interface()})
condSQL, condArgs, _ = builder.ToSQL(cond) colNames = append(colNames, session.Engine.Quote(table.Version)+" = "+session.Engine.Quote(table.Version)+" + 1")
if len(condSQL) > 0 {
condSQL = "WHERE " + condSQL
}
if st.LimitN > 0 {
condSQL = condSQL + fmt.Sprintf(" LIMIT %d", st.LimitN)
}
sqlStr = fmt.Sprintf("UPDATE %v SET %v, %v %v",
session.Engine.Quote(session.Statement.TableName()),
strings.Join(colNames, ", "),
session.Engine.Quote(table.Version)+" = "+session.Engine.Quote(table.Version)+" + 1",
condSQL)
doIncVer = true doIncVer = true
} else {
condSQL, condArgs, _ = builder.ToSQL(cond)
if len(condSQL) > 0 {
condSQL = "WHERE " + condSQL
}
if st.LimitN > 0 {
condSQL = condSQL + fmt.Sprintf(" LIMIT %d", st.LimitN)
}
sqlStr = fmt.Sprintf("UPDATE %v SET %v %v",
session.Engine.Quote(session.Statement.TableName()),
strings.Join(colNames, ", "),
condSQL)
} }
condSQL, condArgs, _ = builder.ToSQL(cond)
if len(condSQL) > 0 {
condSQL = "WHERE " + condSQL
}
if st.OrderStr != "" {
condSQL = condSQL + fmt.Sprintf(" ORDER BY %v", st.OrderStr)
}
// TODO: Only Mysql support
// MSSQL: update top (100) table1 set field1 = 1
if st.LimitN > 0 {
if st.Engine.dialect.DBType() == core.MYSQL {
condSQL = condSQL + fmt.Sprintf(" LIMIT %d", st.LimitN)
} else if st.Engine.dialect.DBType() == core.SQLITE {
tempCondSQL := condSQL + fmt.Sprintf(" LIMIT %d", st.LimitN)
cond = cond.And(builder.Expr(fmt.Sprintf("rowid IN (SELECT rowid FROM %v %v)",
session.Engine.Quote(session.Statement.TableName()), tempCondSQL), condArgs...))
condSQL, condArgs, _ = builder.ToSQL(cond)
if len(condSQL) > 0 {
condSQL = "WHERE " + condSQL
}
}
}
sqlStr = fmt.Sprintf("UPDATE %v SET %v %v",
session.Engine.Quote(session.Statement.TableName()),
strings.Join(colNames, ", "),
condSQL)
res, err := session.exec(sqlStr, append(args, condArgs...)...) res, err := session.exec(sqlStr, append(args, condArgs...)...)
if err != nil { if err != nil {
return 0, err return 0, err

View File

@ -34,3 +34,41 @@ func TestUpdateMap(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
assert.EqualValues(t, 1, cnt) assert.EqualValues(t, 1, cnt)
} }
func TestUpdateLimit(t *testing.T) {
assert.NoError(t, prepareEngine())
type UpdateTable struct {
Id int64
Name string
Age int
}
assert.NoError(t, testEngine.Sync2(new(UpdateTable)))
var tb = UpdateTable{
Name: "test1",
Age: 35,
}
cnt, err := testEngine.Insert(&tb)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
tb.Name = "test2"
tb.Id = 0
cnt, err = testEngine.Insert(&tb)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
cnt, err = testEngine.OrderBy("name desc").Limit(1).Update(&UpdateTable{
Age: 30,
})
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
var uts []UpdateTable
err = testEngine.Find(&uts)
assert.NoError(t, err)
assert.EqualValues(t, 2, len(uts))
assert.EqualValues(t, 35, uts[0].Age)
assert.EqualValues(t, 30, uts[1].Age)
}

View File

@ -16,15 +16,15 @@ var (
) )
func prepareSqlite3Engine() error { func prepareSqlite3Engine() error {
if testEngine == nil { //if testEngine == nil {
os.Remove("./test.db") os.Remove("./test.db")
var err error var err error
testEngine, err = NewEngine("sqlite3", "./test.db") testEngine, err = NewEngine("sqlite3", "./test.db")
if err != nil { if err != nil {
return err return err
}
testEngine.ShowSQL(*showSQL)
} }
testEngine.ShowSQL(*showSQL)
//}
return nil return nil
} }