Skip to content

Commit 122d8c5

Browse files
committed
fix(database/gdb): gdb.Counter not work in OnDuplicate
1 parent 594979c commit 122d8c5

6 files changed

+139
-1
lines changed

contrib/drivers/mysql/mysql_z_unit_model_test.go

+22
Original file line numberDiff line numberDiff line change
@@ -2812,6 +2812,28 @@ func Test_Model_OnDuplicate(t *testing.T) {
28122812
})
28132813
}
28142814

2815+
func Test_Model_OnDuplicateWithCounter(t *testing.T) {
2816+
table := createInitTable()
2817+
defer dropTable(table)
2818+
2819+
gtest.C(t, func(t *gtest.T) {
2820+
data := g.Map{
2821+
"id": 1,
2822+
"passport": "pp1",
2823+
"password": "pw1",
2824+
"nickname": "n1",
2825+
"create_time": "2016-06-06",
2826+
}
2827+
_, err := db.Model(table).OnConflict("id").OnDuplicate(g.Map{
2828+
"id": gdb.Counter{Field: "id", Value: 999999},
2829+
}).Data(data).Save()
2830+
t.AssertNil(err)
2831+
one, err := db.Model(table).WherePri(1).One()
2832+
t.AssertNil(err)
2833+
t.AssertNil(one)
2834+
})
2835+
}
2836+
28152837
func Test_Model_OnDuplicateEx(t *testing.T) {
28162838
table := createInitTable()
28172839
defer dropTable(table)

contrib/drivers/pgsql/pgsql_format_upsert.go

+24-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package pgsql
88

99
import (
1010
"fmt"
11-
1211
"github.com/gogf/gf/v2/database/gdb"
1312
"github.com/gogf/gf/v2/errors/gcode"
1413
"github.com/gogf/gf/v2/errors/gerror"
@@ -40,6 +39,30 @@ func (d *Driver) FormatUpsert(columns []string, list gdb.List, option gdb.DoInse
4039
d.Core.QuoteWord(k),
4140
v,
4241
)
42+
case gdb.Counter:
43+
operator, columnVal := "+", v.(gdb.Counter).Value
44+
if columnVal < 0 {
45+
operator, columnVal = "-", -columnVal
46+
}
47+
onDuplicateStr += fmt.Sprintf(
48+
"%s=EXCLUDED.%s%s%s",
49+
d.QuoteWord(k),
50+
d.QuoteWord(v.(gdb.Counter).Field),
51+
operator,
52+
gconv.String(columnVal),
53+
)
54+
case *gdb.Counter:
55+
operator, columnVal := "+", v.(*gdb.Counter).Value
56+
if columnVal < 0 {
57+
operator, columnVal = "-", -columnVal
58+
}
59+
onDuplicateStr += fmt.Sprintf(
60+
"%s=EXCLUDED.%s%s%s",
61+
d.QuoteWord(k),
62+
d.QuoteWord(v.(*gdb.Counter).Field),
63+
operator,
64+
gconv.String(columnVal),
65+
)
4366
default:
4467
onDuplicateStr += fmt.Sprintf(
4568
"%s=EXCLUDED.%s",

contrib/drivers/pgsql/pgsql_z_unit_model_test.go

+22
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,28 @@ func Test_Model_OnDuplicate(t *testing.T) {
521521
})
522522
}
523523

524+
func Test_Model_OnDuplicateWithCounter(t *testing.T) {
525+
table := createInitTable()
526+
defer dropTable(table)
527+
528+
gtest.C(t, func(t *gtest.T) {
529+
data := g.Map{
530+
"id": 1,
531+
"passport": "pp1",
532+
"password": "pw1",
533+
"nickname": "n1",
534+
"create_time": "2016-06-06",
535+
}
536+
_, err := db.Model(table).OnConflict("id").OnDuplicate(g.Map{
537+
"id": gdb.Counter{Field: "id", Value: 999999},
538+
}).Data(data).Save()
539+
t.AssertNil(err)
540+
one, err := db.Model(table).WherePri(1).One()
541+
t.AssertNil(err)
542+
t.AssertNil(one)
543+
})
544+
}
545+
524546
func Test_Model_OnDuplicateEx(t *testing.T) {
525547
table := createInitTable()
526548
defer dropTable(table)

contrib/drivers/sqlite/sqlite_format_upsert.go

+25
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,31 @@ func (d *Driver) FormatUpsert(columns []string, list gdb.List, option gdb.DoInse
4040
d.Core.QuoteWord(k),
4141
v,
4242
)
43+
44+
case gdb.Counter:
45+
operator, columnVal := "+", v.(gdb.Counter).Value
46+
if columnVal < 0 {
47+
operator, columnVal = "-", -columnVal
48+
}
49+
onDuplicateStr += fmt.Sprintf(
50+
"%s=EXCLUDED.%s%s%s",
51+
d.QuoteWord(k),
52+
d.QuoteWord(v.(gdb.Counter).Field),
53+
operator,
54+
gconv.String(columnVal),
55+
)
56+
case *gdb.Counter:
57+
operator, columnVal := "+", v.(*gdb.Counter).Value
58+
if columnVal < 0 {
59+
operator, columnVal = "-", -columnVal
60+
}
61+
onDuplicateStr += fmt.Sprintf(
62+
"%s=EXCLUDED.%s%s%s",
63+
d.QuoteWord(k),
64+
d.QuoteWord(v.(*gdb.Counter).Field),
65+
operator,
66+
gconv.String(columnVal),
67+
)
4368
default:
4469
onDuplicateStr += fmt.Sprintf(
4570
"%s=EXCLUDED.%s",

contrib/drivers/sqlite/sqlite_z_unit_model_test.go

+22
Original file line numberDiff line numberDiff line change
@@ -4324,3 +4324,25 @@ func Test_OrderRandom(t *testing.T) {
43244324
t.Assert(len(result), TableSize)
43254325
})
43264326
}
4327+
4328+
func Test_Model_OnDuplicateWithCounter(t *testing.T) {
4329+
table := createInitTable()
4330+
defer dropTable(table)
4331+
4332+
gtest.C(t, func(t *gtest.T) {
4333+
data := g.Map{
4334+
"id": 1,
4335+
"passport": "pp1",
4336+
"password": "pw1",
4337+
"nickname": "n1",
4338+
"create_time": "2016-06-06",
4339+
}
4340+
_, err := db.Model(table).OnConflict("id").OnDuplicate(g.Map{
4341+
"id": gdb.Counter{Field: "id", Value: 999999},
4342+
}).Data(data).Save()
4343+
t.AssertNil(err)
4344+
one, err := db.Model(table).WherePri(1).One()
4345+
t.AssertNil(err)
4346+
t.AssertNil(one)
4347+
})
4348+
}

database/gdb/gdb_core_underlying.go

+24
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,30 @@ func (c *Core) FormatUpsert(columns []string, list List, option DoInsertOption)
388388
c.QuoteWord(k),
389389
v,
390390
)
391+
case Counter:
392+
operator, columnVal := "+", v.(Counter).Value
393+
if columnVal < 0 {
394+
operator, columnVal = "-", -columnVal
395+
}
396+
onDuplicateStr += fmt.Sprintf(
397+
"%s=%s%s%s",
398+
c.QuoteWord(k),
399+
c.QuoteWord(v.(Counter).Field),
400+
operator,
401+
gconv.String(columnVal),
402+
)
403+
case *Counter:
404+
operator, columnVal := "+", v.(*Counter).Value
405+
if columnVal < 0 {
406+
operator, columnVal = "-", -columnVal
407+
}
408+
onDuplicateStr += fmt.Sprintf(
409+
"%s=%s%s%s",
410+
c.QuoteWord(k),
411+
c.QuoteWord(v.(*Counter).Field),
412+
operator,
413+
gconv.String(columnVal),
414+
)
391415
default:
392416
onDuplicateStr += fmt.Sprintf(
393417
"%s=VALUES(%s)",

0 commit comments

Comments
 (0)