Skip to content

Commit de1e787

Browse files
committed
feat: add page
1 parent 9766434 commit de1e787

File tree

3 files changed

+115
-58
lines changed

3 files changed

+115
-58
lines changed

gormplus/gormplus.go

Lines changed: 0 additions & 9 deletions
This file was deleted.

gormplus/mapper.go

Lines changed: 86 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,115 +4,160 @@ import (
44
"gorm.io/gorm"
55
)
66

7-
var GormDb *gorm.DB
7+
var gormDb *gorm.DB
8+
var defaultBatchSize = 1000
9+
10+
func Init(db *gorm.DB) {
11+
gormDb = db
12+
}
13+
14+
type Page struct {
15+
Page int
16+
PageSize int
17+
}
818

919
func Insert[T any](entity *T) *gorm.DB {
10-
resultDb := GormDb.Create(&entity)
20+
resultDb := gormDb.Create(&entity)
1121
return resultDb
1222
}
1323

1424
func InsertMigrate[T any](entity *T) (*gorm.DB, error) {
15-
if err := GormDb.AutoMigrate(new(T)); err != nil {
25+
if err := gormDb.AutoMigrate(new(T)); err != nil {
1626
return nil, err
1727
}
18-
resultDb := GormDb.Create(&entity)
28+
resultDb := gormDb.Create(&entity)
1929
return resultDb, nil
2030
}
2131

2232
func InsertBatch[T any](entities ...*T) *gorm.DB {
23-
resultDb := GormDb.Create(&entities)
33+
resultDb := gormDb.CreateInBatches(&entities, defaultBatchSize)
34+
return resultDb
35+
}
36+
37+
func InsertBatchSize[T any](batchSize int, entities ...*T) *gorm.DB {
38+
if batchSize <= 0 {
39+
batchSize = defaultBatchSize
40+
}
41+
resultDb := gormDb.CreateInBatches(&entities, batchSize)
2442
return resultDb
2543
}
2644

2745
func InsertBatchMigrate[T any](entities ...*T) (*gorm.DB, error) {
28-
if err := GormDb.AutoMigrate(new(T)); err != nil {
46+
if err := gormDb.AutoMigrate(new(T)); err != nil {
2947
return nil, err
3048
}
31-
resultDb := GormDb.Create(&entities)
49+
resultDb := gormDb.Create(&entities)
3250
return resultDb, nil
3351
}
3452

3553
func DeleteById[T any](id any) *gorm.DB {
36-
resultDb := GormDb.Delete(new(T), id)
54+
resultDb := gormDb.Delete(new(T), id)
3755
return resultDb
3856
}
3957

4058
func DeleteByIds[T any](ids ...any) *gorm.DB {
4159
var entities []T
42-
resultDb := GormDb.Delete(&entities, ids)
60+
resultDb := gormDb.Delete(&entities, ids)
4361
return resultDb
4462
}
4563

4664
func Delete[T any](q *Query[T]) *gorm.DB {
4765
var entity T
48-
resultDb := GormDb.Where(q.QueryBuilder.String(), q.QueryArgs...).Delete(&entity)
66+
resultDb := gormDb.Where(q.QueryBuilder.String(), q.QueryArgs...).Delete(&entity)
4967
return resultDb
5068
}
5169

5270
func UpdateById[T any](id any, entity *T) *gorm.DB {
5371
var e T
54-
GormDb.First(&e, id)
55-
resultDb := GormDb.Model(&e).Updates(entity)
72+
gormDb.First(&e, id)
73+
resultDb := gormDb.Model(&e).Updates(entity)
5674
return resultDb
5775
}
5876

5977
func Update[T any](q *Query[T], entity *T) *gorm.DB {
60-
resultDb := GormDb.Where(q.QueryBuilder.String(), q.QueryArgs...).Updates(entity)
78+
resultDb := gormDb.Where(q.QueryBuilder.String(), q.QueryArgs...).Updates(entity)
6179
return resultDb
6280
}
6381

6482
func SelectById[T any](id any) (*gorm.DB, T) {
6583
var entity T
66-
resultDb := GormDb.First(&entity, id)
84+
resultDb := gormDb.Limit(1).Find(&entity, id)
6785
return resultDb, entity
6886
}
6987

7088
func SelectByIds[T any](ids ...any) (*gorm.DB, []T) {
7189
var results []T
72-
resultDb := GormDb.Find(&results, ids)
90+
resultDb := gormDb.Find(&results, ids)
7391
return resultDb, results
7492
}
7593

7694
func SelectOne[T any](q *Query[T]) (*gorm.DB, T) {
7795
var entity T
78-
resultDb := GormDb.Select(q.SelectColumns).Where(q.QueryBuilder.String(), q.QueryArgs...).First(&entity)
96+
resultDb := gormDb.Select(q.SelectColumns).Where(q.QueryBuilder.String(), q.QueryArgs...).Limit(1).Find(&entity)
7997
return resultDb, entity
8098
}
8199

82100
func SelectList[T any](q *Query[T]) (*gorm.DB, []T) {
101+
resultDb := buildCondition(q)
83102
var results []T
84-
resultDb := GormDb.Model(new(T))
103+
resultDb.Find(&results)
104+
return resultDb, results
105+
}
85106

86-
if len(q.DistinctColumns) > 0 {
87-
resultDb.Distinct(q.DistinctColumns)
88-
}
107+
func SelectPage[T any](page Page, q *Query[T]) (*gorm.DB, []T) {
108+
resultDb := buildCondition(q)
109+
var results []T
110+
resultDb.Scopes(paginate(page)).Find(&results)
111+
return resultDb, results
112+
}
89113

90-
if len(q.SelectColumns) > 0 {
91-
resultDb.Select(q.SelectColumns)
92-
}
114+
func SelectCount[T any](q *Query[T]) (*gorm.DB, int64) {
115+
var count int64
116+
resultDb := gormDb.Model(new(T)).Where(q.QueryBuilder.String(), q.QueryArgs...).Count(&count)
117+
return resultDb, count
118+
}
93119

94-
if q.QueryBuilder.Len() > 0 {
95-
resultDb.Where(q.QueryBuilder.String(), q.QueryArgs...)
120+
func paginate(p Page) func(db *gorm.DB) *gorm.DB {
121+
page := p.Page
122+
pageSize := p.PageSize
123+
return func(db *gorm.DB) *gorm.DB {
124+
if page <= 0 {
125+
page = 1
126+
}
127+
if pageSize <= 0 {
128+
pageSize = 10
129+
}
130+
offset := (page - 1) * pageSize
131+
return db.Offset(offset).Limit(pageSize)
96132
}
133+
}
97134

98-
if q.OrderBuilder.Len() > 0 {
99-
resultDb.Order(q.OrderBuilder.String())
100-
}
135+
func buildCondition[T any](q *Query[T]) *gorm.DB {
136+
resultDb := gormDb.Model(new(T))
137+
if q != nil {
138+
if len(q.DistinctColumns) > 0 {
139+
resultDb.Distinct(q.DistinctColumns)
140+
}
101141

102-
if q.GroupBuilder.Len() > 0 {
103-
resultDb.Group(q.GroupBuilder.String())
104-
}
142+
if len(q.SelectColumns) > 0 {
143+
resultDb.Select(q.SelectColumns)
144+
}
105145

106-
if q.HavingBuilder.Len() > 0 {
107-
resultDb.Having(q.HavingBuilder.String(), q.HavingArgs...)
108-
}
146+
if q.QueryBuilder.Len() > 0 {
147+
resultDb.Where(q.QueryBuilder.String(), q.QueryArgs...)
148+
}
109149

110-
resultDb.Find(&results)
111-
return resultDb, results
112-
}
150+
if q.OrderBuilder.Len() > 0 {
151+
resultDb.Order(q.OrderBuilder.String())
152+
}
113153

114-
func SelectCount[T any](q *Query[T]) (*gorm.DB, int64) {
115-
var count int64
116-
resultDb := GormDb.Model(new(T)).Where(q.QueryBuilder.String(), q.QueryArgs...).Count(&count)
117-
return resultDb, count
154+
if q.GroupBuilder.Len() > 0 {
155+
resultDb.Group(q.GroupBuilder.String())
156+
}
157+
158+
if q.HavingBuilder.Len() > 0 {
159+
resultDb.Having(q.HavingBuilder.String(), q.HavingArgs...)
160+
}
161+
}
162+
return resultDb
118163
}

gormplus/mapper_test.go

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
func init() {
1313
dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
1414
var err error
15-
GormDb, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
15+
gormDb, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
1616
Logger: logger.Default.LogMode(logger.Info),
1717
})
1818
if err != nil {
@@ -26,14 +26,14 @@ type Test1 struct {
2626
Price uint
2727
}
2828

29-
func TestSave(t *testing.T) {
29+
func TestInsert(t *testing.T) {
3030
test1 := Test1{Code: "D455", Price: 200}
3131
resultDb := Insert(&test1)
3232
fmt.Println(resultDb)
3333
fmt.Println(test1)
3434
}
3535

36-
func TestSaveMigrate(t *testing.T) {
36+
func TestInsertMigrate(t *testing.T) {
3737
test1 := Test1{Code: "D455", Price: 100}
3838
resultDb, err := InsertMigrate(&test1)
3939
if err != nil {
@@ -43,16 +43,28 @@ func TestSaveMigrate(t *testing.T) {
4343
fmt.Println(test1)
4444
}
4545

46-
func TestBatchSave(t *testing.T) {
46+
func TestInsertBatch(t *testing.T) {
4747
test1 := Test1{Code: "D466", Price: 100}
4848
test2 := Test1{Code: "D466", Price: 100}
49+
4950
resultDb := InsertBatch(&test1, &test2)
5051
fmt.Println(resultDb)
5152
fmt.Println(test1)
5253
fmt.Println(test2)
5354
}
5455

55-
func TestSaveBatchMigrate(t *testing.T) {
56+
func TestInsertBatchSize(t *testing.T) {
57+
test1 := Test1{Code: "D466", Price: 100}
58+
test2 := Test1{Code: "D466", Price: 100}
59+
test3 := Test1{Code: "D466", Price: 100}
60+
61+
resultDb := InsertBatchSize(2, &test1, &test2, &test3)
62+
fmt.Println(resultDb)
63+
fmt.Println(test1)
64+
fmt.Println(test2)
65+
}
66+
67+
func TestInsertBatchMigrate(t *testing.T) {
5668
test1 := Test1{Code: "D477", Price: 100}
5769
test2 := Test1{Code: "D477", Price: 100}
5870
resultDb, err := InsertBatchMigrate(&test1, &test2)
@@ -91,6 +103,7 @@ func TestUpdate(t *testing.T) {
91103
q := Query[Test1]{}
92104
q.Eq("code", "D42").Eq("price", 100)
93105
test1 := Test1{Code: "888"}
106+
// todo 需要给用户选择字段更新
94107
resultDb := Update(&q, &test1)
95108
fmt.Println(resultDb)
96109
}
@@ -116,9 +129,17 @@ func TestSelectOne(t *testing.T) {
116129
}
117130

118131
func TestSelectList(t *testing.T) {
119-
q := Query[Test1]{}
120-
q.In("code", "D455")
121-
db, result := SelectList(&q)
132+
db, result := SelectList[Test1](nil)
133+
fmt.Println(db.RowsAffected)
134+
for _, v := range result {
135+
marshal, _ := json.Marshal(v)
136+
fmt.Println(string(marshal))
137+
}
138+
}
139+
140+
func TestSelectPage(t *testing.T) {
141+
page := Page{Page: 1, PageSize: 10}
142+
db, result := SelectPage[Test1](page, nil)
122143
fmt.Println(db.RowsAffected)
123144
for _, v := range result {
124145
marshal, _ := json.Marshal(v)

0 commit comments

Comments
 (0)