fix #544
This commit is contained in:
parent
5789833408
commit
08956a4864
|
@ -262,38 +262,39 @@ 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)
|
condSQL, condArgs, _ = builder.ToSQL(cond)
|
||||||
if len(condSQL) > 0 {
|
if len(condSQL) > 0 {
|
||||||
condSQL = "WHERE " + condSQL
|
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.LimitN > 0 {
|
||||||
|
if st.Engine.dialect.DBType() == core.MYSQL {
|
||||||
condSQL = condSQL + fmt.Sprintf(" LIMIT %d", st.LimitN)
|
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",
|
sqlStr = fmt.Sprintf("UPDATE %v SET %v %v",
|
||||||
session.Engine.Quote(session.Statement.TableName()),
|
session.Engine.Quote(session.Statement.TableName()),
|
||||||
strings.Join(colNames, ", "),
|
strings.Join(colNames, ", "),
|
||||||
condSQL)
|
condSQL)
|
||||||
}
|
|
||||||
|
|
||||||
res, err := session.exec(sqlStr, append(args, condArgs...)...)
|
res, err := session.exec(sqlStr, append(args, condArgs...)...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ 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")
|
||||||
|
@ -24,7 +24,7 @@ func prepareSqlite3Engine() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
testEngine.ShowSQL(*showSQL)
|
testEngine.ShowSQL(*showSQL)
|
||||||
}
|
//}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue