fix: refactor update sql (#5274)
* fix: refactor UpdateSQL method and add test * fix: add modify record into CHANGELOG * fix: modify url in the CHANGELOG * fix: modify pr url in the CHANGELOG
This commit is contained in:
parent
957c526efb
commit
24b41552c5
@ -11,6 +11,7 @@
|
|||||||
- [fix: modify InsertOrUpdate method, Remove the isMulti variable and its associated code](https://github.com/beego/beego/pull/5269)
|
- [fix: modify InsertOrUpdate method, Remove the isMulti variable and its associated code](https://github.com/beego/beego/pull/5269)
|
||||||
- [refactor cache/redis: Use redisConfig to receive incoming JSON (previously using a map)](https://github.com/beego/beego/pull/5268)
|
- [refactor cache/redis: Use redisConfig to receive incoming JSON (previously using a map)](https://github.com/beego/beego/pull/5268)
|
||||||
- [fix: refactor DeleteSQL method](https://github.com/beego/beego/pull/5271)
|
- [fix: refactor DeleteSQL method](https://github.com/beego/beego/pull/5271)
|
||||||
|
- [fix: refactor UpdateSQL method](https://github.com/beego/beego/pull/5274)
|
||||||
|
|
||||||
## ORM refactoring
|
## ORM refactoring
|
||||||
- [introducing internal/models pkg](https://github.com/beego/beego/pull/5238)
|
- [introducing internal/models pkg](https://github.com/beego/beego/pull/5238)
|
||||||
|
|||||||
@ -674,14 +674,7 @@ func (d *dbBase) Update(ctx context.Context, q dbQuerier, mi *models.ModelInfo,
|
|||||||
|
|
||||||
setValues = append(setValues, pkValue)
|
setValues = append(setValues, pkValue)
|
||||||
|
|
||||||
Q := d.ins.TableQuote()
|
query := d.UpdateSQL(setNames, pkName, mi)
|
||||||
|
|
||||||
sep := fmt.Sprintf("%s = ?, %s", Q, Q)
|
|
||||||
setColumns := strings.Join(setNames, sep)
|
|
||||||
|
|
||||||
query := fmt.Sprintf("UPDATE %s%s%s SET %s%s%s = ? WHERE %s%s%s = ?", Q, mi.Table, Q, Q, setColumns, Q, Q, pkName, Q)
|
|
||||||
|
|
||||||
d.ins.ReplaceMarks(&query)
|
|
||||||
|
|
||||||
res, err := q.ExecContext(ctx, query, setValues...)
|
res, err := q.ExecContext(ctx, query, setValues...)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@ -690,6 +683,40 @@ func (d *dbBase) Update(ctx context.Context, q dbQuerier, mi *models.ModelInfo,
|
|||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *dbBase) UpdateSQL(setNames []string, pkName string, mi *models.ModelInfo) string {
|
||||||
|
buf := buffers.Get()
|
||||||
|
defer buffers.Put(buf)
|
||||||
|
|
||||||
|
Q := d.ins.TableQuote()
|
||||||
|
|
||||||
|
_, _ = buf.WriteString("UPDATE ")
|
||||||
|
_, _ = buf.WriteString(Q)
|
||||||
|
_, _ = buf.WriteString(mi.Table)
|
||||||
|
_, _ = buf.WriteString(Q)
|
||||||
|
_, _ = buf.WriteString(" SET ")
|
||||||
|
|
||||||
|
for i, name := range setNames {
|
||||||
|
if i > 0 {
|
||||||
|
_, _ = buf.WriteString(", ")
|
||||||
|
}
|
||||||
|
_, _ = buf.WriteString(Q)
|
||||||
|
_, _ = buf.WriteString(name)
|
||||||
|
_, _ = buf.WriteString(Q)
|
||||||
|
_, _ = buf.WriteString(" = ?")
|
||||||
|
}
|
||||||
|
|
||||||
|
_, _ = buf.WriteString(" WHERE ")
|
||||||
|
_, _ = buf.WriteString(Q)
|
||||||
|
_, _ = buf.WriteString(pkName)
|
||||||
|
_, _ = buf.WriteString(Q)
|
||||||
|
_, _ = buf.WriteString(" = ?")
|
||||||
|
|
||||||
|
query := buf.String()
|
||||||
|
d.ins.ReplaceMarks(&query)
|
||||||
|
|
||||||
|
return query
|
||||||
|
}
|
||||||
|
|
||||||
// Delete execute delete sql dbQuerier with given struct reflect.Value.
|
// Delete execute delete sql dbQuerier with given struct reflect.Value.
|
||||||
// delete index is pk.
|
// delete index is pk.
|
||||||
func (d *dbBase) Delete(ctx context.Context, q dbQuerier, mi *models.ModelInfo, ind reflect.Value, tz *time.Location, cols []string) (int64, error) {
|
func (d *dbBase) Delete(ctx context.Context, q dbQuerier, mi *models.ModelInfo, ind reflect.Value, tz *time.Location, cols []string) (int64, error) {
|
||||||
|
|||||||
@ -129,6 +129,50 @@ func TestDbBase_InsertValueSQL(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDbBase_UpdateSQL(t *testing.T) {
|
||||||
|
mi := &models.ModelInfo{
|
||||||
|
Table: "test_table",
|
||||||
|
}
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
db *dbBase
|
||||||
|
|
||||||
|
setNames []string
|
||||||
|
pkName string
|
||||||
|
|
||||||
|
wantRes string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "update by dbBase",
|
||||||
|
db: &dbBase{
|
||||||
|
ins: &dbBase{},
|
||||||
|
},
|
||||||
|
setNames: []string{"name", "age", "sender"},
|
||||||
|
pkName: "id",
|
||||||
|
wantRes: "UPDATE `test_table` SET `name` = ?, `age` = ?, `sender` = ? WHERE `id` = ?",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "update by dbBasePostgres",
|
||||||
|
db: &dbBase{
|
||||||
|
ins: newdbBasePostgres(),
|
||||||
|
},
|
||||||
|
setNames: []string{"name", "age", "sender"},
|
||||||
|
pkName: "id",
|
||||||
|
wantRes: "UPDATE \"test_table\" SET \"name\" = $1, \"age\" = $2, \"sender\" = $3 WHERE \"id\" = $4",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
|
||||||
|
res := tc.db.UpdateSQL(tc.setNames, tc.pkName, mi)
|
||||||
|
|
||||||
|
assert.Equal(t, tc.wantRes, res)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestDbBase_DeleteSQL(t *testing.T) {
|
func TestDbBase_DeleteSQL(t *testing.T) {
|
||||||
mi := &models.ModelInfo{
|
mi := &models.ModelInfo{
|
||||||
Table: "test_table",
|
Table: "test_table",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user