@@ -4,115 +4,160 @@ import (
4
4
"gorm.io/gorm"
5
5
)
6
6
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
+ }
8
18
9
19
func Insert [T any ](entity * T ) * gorm.DB {
10
- resultDb := GormDb .Create (& entity )
20
+ resultDb := gormDb .Create (& entity )
11
21
return resultDb
12
22
}
13
23
14
24
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 {
16
26
return nil , err
17
27
}
18
- resultDb := GormDb .Create (& entity )
28
+ resultDb := gormDb .Create (& entity )
19
29
return resultDb , nil
20
30
}
21
31
22
32
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 )
24
42
return resultDb
25
43
}
26
44
27
45
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 {
29
47
return nil , err
30
48
}
31
- resultDb := GormDb .Create (& entities )
49
+ resultDb := gormDb .Create (& entities )
32
50
return resultDb , nil
33
51
}
34
52
35
53
func DeleteById [T any ](id any ) * gorm.DB {
36
- resultDb := GormDb .Delete (new (T ), id )
54
+ resultDb := gormDb .Delete (new (T ), id )
37
55
return resultDb
38
56
}
39
57
40
58
func DeleteByIds [T any ](ids ... any ) * gorm.DB {
41
59
var entities []T
42
- resultDb := GormDb .Delete (& entities , ids )
60
+ resultDb := gormDb .Delete (& entities , ids )
43
61
return resultDb
44
62
}
45
63
46
64
func Delete [T any ](q * Query [T ]) * gorm.DB {
47
65
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 )
49
67
return resultDb
50
68
}
51
69
52
70
func UpdateById [T any ](id any , entity * T ) * gorm.DB {
53
71
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 )
56
74
return resultDb
57
75
}
58
76
59
77
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 )
61
79
return resultDb
62
80
}
63
81
64
82
func SelectById [T any ](id any ) (* gorm.DB , T ) {
65
83
var entity T
66
- resultDb := GormDb . First (& entity , id )
84
+ resultDb := gormDb . Limit ( 1 ). Find (& entity , id )
67
85
return resultDb , entity
68
86
}
69
87
70
88
func SelectByIds [T any ](ids ... any ) (* gorm.DB , []T ) {
71
89
var results []T
72
- resultDb := GormDb .Find (& results , ids )
90
+ resultDb := gormDb .Find (& results , ids )
73
91
return resultDb , results
74
92
}
75
93
76
94
func SelectOne [T any ](q * Query [T ]) (* gorm.DB , T ) {
77
95
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 )
79
97
return resultDb , entity
80
98
}
81
99
82
100
func SelectList [T any ](q * Query [T ]) (* gorm.DB , []T ) {
101
+ resultDb := buildCondition (q )
83
102
var results []T
84
- resultDb := GormDb .Model (new (T ))
103
+ resultDb .Find (& results )
104
+ return resultDb , results
105
+ }
85
106
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
+ }
89
113
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
+ }
93
119
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 )
96
132
}
133
+ }
97
134
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
+ }
101
141
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
+ }
105
145
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
+ }
109
149
110
- resultDb . Find ( & results )
111
- return resultDb , results
112
- }
150
+ if q . OrderBuilder . Len () > 0 {
151
+ resultDb . Order ( q . OrderBuilder . String ())
152
+ }
113
153
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
118
163
}
0 commit comments