-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdb_client.go
More file actions
249 lines (223 loc) · 14.6 KB
/
db_client.go
File metadata and controls
249 lines (223 loc) · 14.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
package sqlmer
import (
"context"
"time"
"github.com/bunnier/sqlmer/sqlen"
)
type any = interface{} // 空接口的别名,同时兼容 Go 1.18 。
// ErrorDbClient 为 error 版本 API。
type DbClient interface {
// Dsn 用于获取当前实例所使用的数据库连接字符串。
Dsn() string
// GetConnTimeout 用于获取当前 DbClient 实例的获取连接的超时时间。
GetConnTimeout() time.Duration
// GetExecTimeout 用于获取当前 DbClient 实例的执行超时时间。
GetExecTimeout() time.Duration
// CreateTransaction 用于开始一个事务。
// returns:
// @tran 返回一个实现了 TransactionKeeper(内嵌 DbClient 接口) 接口的对象,在上面执行的语句会在同一个事务中执行。
// @err 创建事务时遇到的错误。
CreateTransaction() (tran TransactionKeeper, err error)
// Execute 用于执行非查询SQL语句,并返回所影响的行数。
// params:
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @effectedRows 语句影响的行数。
// @err 执行语句时遇到的错误。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrGetEffectedRows: 当执行成功,但驱动不支持获取影响行数时候,返回该类型错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
Execute(sqlText string, args ...any) (rowsEffected int64, err error)
// ExecuteContext 用于执行非查询 sql 语句,并返回所影响的行数。
// params:
// @ctx context。
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @effectedRows 语句影响的行数。
// @err 执行语句时遇到的错误。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrGetEffectedRows: 当执行成功,但驱动不支持获取影响行数时候,返回该类型错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
ExecuteContext(ctx context.Context, sqlText string, args ...any) (rowsEffected int64, err error)
// SizedExecute 用于执行非查询SQL语句,并断言所影响的行数。
// params:
// @expectedSize 预期的影响行数,当
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @err 执行语句时遇到的错误。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrGetEffectedRows: 当执行成功,但驱动不支持获取影响行数时候,返回该类型错误。
// - sqlmer.ErrExpectedSizeWrong: 当没有影响到预期行数时返回该类错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
SizedExecute(expectedSize int64, sqlText string, args ...any) error
// SizedExecuteContext 用于执行非查询SQL语句,并断言所影响的行数。
// params:
// @ctx context。
// @expectedSize 预期的影响行数,当
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @err 执行语句时遇到的错误。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrGetEffectedRows: 当执行成功,但驱动不支持获取影响行数时候,返回该类型错误。
// - sqlmer.ErrExpectedSizeWrong: 当没有影响到预期行数时返回该类错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
SizedExecuteContext(ctx context.Context, expectedSize int64, sqlText string, args ...any) error
// Exists 用于判断给定的查询的结果是否至少包含 1 行。
// params:
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @ok 结果至少包含一行。
// @err 执行语句时遇到的错误。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
Exists(sqlText string, args ...any) (ok bool, err error)
// ExistsContext 用于判断给定的查询的结果是否至少包含 1 行。
// params:
// @ctx context。
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @ok 结果至少包含一行。
// @err 执行语句时遇到的错误。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
ExistsContext(ctx context.Context, sqlText string, args ...any) (ok bool, err error)
// Scalar 用于获取查询的第一行第一列的值。
// params:
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @cell 目标查询第一行第一列的值。
// @hit true 表明有命中数据,false 则为没有命中数据,可通过该值区分是否为数据库空值。
// @err 执行语句时遇到的错误。注意,sql.ErrNoRows 不放 error 中返回,而通过第二个返回值区分。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
Scalar(sqlText string, args ...any) (cell any, hit bool, err error)
// ScalarContext 用于获取查询的第一行第一列的值。
// params:
// @ctx context。
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @cell 目标查询第一行第一列的值。
// @hit true 表明有命中数据,false 则为没有命中数据,可通过该值区分是否为数据库空值。
// @err 执行语句时遇到的错误。注意,sql.ErrNoRows 不放 error 中返回,而通过第二个返回值区分。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
ScalarContext(ctx context.Context, sqlText string, args ...any) (cell any, hit bool, err error)
// Get 用于获取查询结果的第一行记录。
// params:
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @mapRow 目标查询第一行的结果。
// @err 执行语句时遇到的错误。注意,sql.ErrNoRows 不放 error 中返回,要知道是否有数据可直接判断第一个返回值是否为 nil。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
Get(sqlText string, args ...any) (mapRow map[string]any, err error)
// GetContext 用于获取查询结果的第一行记录。
// params:
// @ctx context。
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @mapRow 目标查询第一行的结果。
// @err 执行语句时遇到的错误。注意,sql.ErrNoRows 不放 error 中返回,要知道是否有数据可直接判断第一个返回值是否为 nil。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
GetContext(ctx context.Context, sqlText string, args ...any) (mapRow map[string]any, err error)
// SliceGet 用于获取查询结果的所有行。
// params:
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @mapRows 目标查询结果的所有行。
// @err 执行语句时遇到的错误。注意,sql.ErrNoRows 不放 error 中返回,要知道是否有数据可直接判断第一个返回值的 len。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
SliceGet(sqlText string, args ...any) (mapRows []map[string]any, err error)
// SliceGetContext 用于获取查询结果得行序列。
// params:
// @ctx context。
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @mapRows 目标查询结果的所有行。
// @err 执行语句时遇到的错误。注意,sql.ErrNoRows 不放 error 中返回,要知道是否有数据可直接判断第一个返回值的 len。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
SliceGetContext(ctx context.Context, sqlText string, args ...any) (mapRows []map[string]any, err error)
// Row 用于获取单个查询结果行。
// params:
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @row 返回目标行的 EnhanceRow 对象(是对 sql.Row 的增强包装对象)。
// @err 执行语句时遇到的错误。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
Row(sqlText string, args ...any) (row *sqlen.EnhanceRow, err error)
// RowContext 用于获取单个查询结果行。
// params:
// @ctx context。
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @row 返回目标行的 EnhanceRow 对象(是对 sql.Row 的增强包装对象)。
// @err 执行语句时遇到的错误。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
RowContext(context context.Context, sqlText string, args ...any) (row *sqlen.EnhanceRow, err error)
// Rows 用于获取查询结果行的游标对象。
// params:
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @row 返回目标行的 EnhanceRows 对象(是对 sql.Rows 的增强包装对象)。
// @err 执行语句时遇到的错误。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
Rows(sqlText string, args ...any) (rows *sqlen.EnhanceRows, err error)
// RowsContext 用于获取查询结果行的游标对象。
// params:
// @ctx context。
// @sqlText SQL 语句,支持 @ 的命名参数占位及 @p1...@pn 这样的索引占位符。
// @args SQL 语句的参数,支持通过 map[string]any 提供命名参数值 或 通过变长参数提供索引参数值。
// returns:
// @row 返回目标行的 EnhanceRows 对象(是对 sql.Rows 的增强包装对象)。
// @err 执行语句时遇到的错误。
// 可以通过 errors.Is 判断的特殊 err:
// - sqlmer.ErrParseParamFailed: 当 SQL 语句中的参数解析失败时返回该类错误。
// - sqlmer.ErrExecutingSql: 当 SQL 语句执行时遇到错误,返回该类型错误。
RowsContext(context context.Context, sqlText string, args ...any) (rows *sqlen.EnhanceRows, err error)
}
// TransactionKeeper 是一个定义数据库事务容器。
type TransactionKeeper interface {
DbClient // DbClient 实现了数据库访问客户端的功能。
// Commit 用于提交事务。
Commit() error
// Rollback 用于回滚事务。
Rollback() error
// Close 用于优雅关闭事务,创建事务后可 defer 执行本方法。
Close() error
}