wok-server 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +61 -0
- package/README.md +44 -29
- package/dist/cache/cache.js +98 -98
- package/dist/cache/config.js +19 -19
- package/dist/cache/index.js +27 -27
- package/dist/cache/purge-task.js +46 -46
- package/dist/cache/stat.js +47 -47
- package/dist/config/convert.js +36 -36
- package/dist/config/exception.js +14 -14
- package/dist/config/index.js +81 -81
- package/dist/http-client/index.js +136 -136
- package/dist/i18n/ar.js +17 -17
- package/dist/i18n/de.js +17 -17
- package/dist/i18n/en-us.js +17 -17
- package/dist/i18n/es.js +17 -17
- package/dist/i18n/fr.js +17 -17
- package/dist/i18n/i18n.js +231 -231
- package/dist/i18n/index.js +52 -52
- package/dist/i18n/ja.js +17 -17
- package/dist/i18n/ko.js +17 -17
- package/dist/i18n/msg.js +2 -2
- package/dist/i18n/pt.js +17 -17
- package/dist/i18n/ru.js +17 -17
- package/dist/i18n/tag.js +18 -18
- package/dist/i18n/zh-HK.js +17 -17
- package/dist/i18n/zh-TW.js +17 -17
- package/dist/i18n/zh-cn.js +17 -17
- package/dist/index.js +14 -14
- package/dist/lock/index.js +114 -114
- package/dist/log/config.js +35 -35
- package/dist/log/date.js +21 -21
- package/dist/log/file.js +198 -198
- package/dist/log/index.js +135 -135
- package/dist/log/level.js +33 -33
- package/dist/log/log.js +56 -56
- package/dist/log/store.js +19 -19
- package/dist/mongodb/collection.js +2 -2
- package/dist/mongodb/config.js +34 -34
- package/dist/mongodb/doc.js +2 -2
- package/dist/mongodb/exception.js +14 -14
- package/dist/mongodb/index.js +58 -58
- package/dist/mongodb/manager/base.js +563 -563
- package/dist/mongodb/manager/index.js +63 -63
- package/dist/mongodb/manager/tx-strict.js +84 -84
- package/dist/mongodb/manager/tx.js +30 -30
- package/dist/mongodb/migration.js +52 -52
- package/dist/mvc/access-log.js +33 -33
- package/dist/mvc/config.js +27 -27
- package/dist/mvc/exchange.js +113 -113
- package/dist/mvc/handler/index.js +7 -6
- package/dist/mvc/handler/json.js +65 -65
- package/dist/mvc/handler/restful.js +35 -35
- package/dist/mvc/handler/sse.js +65 -0
- package/dist/mvc/handler/upload.js +31 -31
- package/dist/mvc/index.js +50 -50
- package/dist/mvc/interceptor.js +2 -2
- package/dist/mvc/query.js +43 -43
- package/dist/mvc/render/file.js +132 -132
- package/dist/mvc/render/html/html.js +90 -90
- package/dist/mvc/render/html/index.js +18 -18
- package/dist/mvc/render/html/style.js +2 -2
- package/dist/mvc/render/index.js +7 -7
- package/dist/mvc/render/json.js +26 -26
- package/dist/mvc/render/text.js +16 -16
- package/dist/mvc/router.js +2 -2
- package/dist/mvc/server.js +272 -272
- package/dist/mvc/static/header.js +67 -67
- package/dist/mvc/static/index.js +6 -6
- package/dist/mvc/static/mime-type.js +84 -84
- package/dist/mvc/static/server-cache-config.js +66 -66
- package/dist/mvc/static/server-cache.js +133 -133
- package/dist/mvc/static/static-handler.js +372 -372
- package/dist/mysql/config.js +51 -51
- package/dist/mysql/exception.js +14 -14
- package/dist/mysql/index.js +87 -87
- package/dist/mysql/manager/base.js +278 -239
- package/dist/mysql/manager/index.js +107 -107
- package/dist/mysql/manager/ops/count.js +20 -20
- package/dist/mysql/manager/ops/criteria.js +381 -356
- package/dist/mysql/manager/ops/delete.js +59 -65
- package/dist/mysql/manager/ops/exist.js +26 -26
- package/dist/mysql/manager/ops/find.js +149 -169
- package/dist/mysql/manager/ops/index.js +16 -14
- package/dist/mysql/manager/ops/insert.js +132 -106
- package/dist/mysql/manager/ops/modify.js +10 -10
- package/dist/mysql/manager/ops/order-by.js +28 -0
- package/dist/mysql/manager/ops/paginate.js +48 -23
- package/dist/mysql/manager/ops/query.js +9 -9
- package/dist/mysql/manager/ops/update.js +222 -216
- package/dist/mysql/manager/ops/upsert.js +178 -0
- package/dist/mysql/manager/ops/utils.js +28 -24
- package/dist/mysql/manager/tx-strict.js +103 -103
- package/dist/mysql/manager/tx.js +30 -30
- package/dist/mysql/manager/utils.js +56 -56
- package/dist/mysql/migration.js +136 -136
- package/dist/mysql/table-info.js +8 -8
- package/dist/task/daily.js +59 -59
- package/dist/task/fixed-delay.js +38 -38
- package/dist/task/fixed-rate.js +42 -42
- package/dist/task/index.js +9 -9
- package/dist/task/task.js +56 -56
- package/dist/validation/exception.js +36 -36
- package/dist/validation/index.js +40 -40
- package/dist/validation/validator/array.js +34 -34
- package/dist/validation/validator/enum.js +28 -28
- package/dist/validation/validator/index.js +14 -14
- package/dist/validation/validator/length.js +40 -40
- package/dist/validation/validator/max-length.js +35 -35
- package/dist/validation/validator/max.js +29 -29
- package/dist/validation/validator/min-length.js +33 -33
- package/dist/validation/validator/min.js +29 -29
- package/dist/validation/validator/not-blank.js +33 -33
- package/dist/validation/validator/not-null.js +21 -21
- package/dist/validation/validator/plain-obj.js +32 -32
- package/dist/validation/validator/regexp.js +34 -34
- package/documentation/en/cache.md +56 -0
- package/documentation/en/config.md +96 -0
- package/documentation/en/engineering.md +256 -0
- package/documentation/en/http-client.md +32 -0
- package/documentation/en/i18n.md +143 -0
- package/documentation/en/index.md +24 -0
- package/documentation/en/lock.md +51 -0
- package/documentation/en/log.md +109 -0
- package/documentation/en/mongodb.md +256 -0
- package/documentation/en/mvc.md +688 -0
- package/documentation/en/mysql.md +682 -0
- package/documentation/en/task.md +45 -0
- package/documentation/en/test.md +56 -0
- package/documentation/en/validate.md +130 -0
- package/documentation/zh-cn/mvc.md +66 -24
- package/documentation/zh-cn/mysql.md +146 -17
- package/package.json +4 -1
- package/skills/wok-server-api-rules/SKILL.md +350 -0
- package/skills/wok-server-cache/SKILL.md +216 -0
- package/skills/wok-server-code-navigation/SKILL.md +153 -0
- package/skills/wok-server-config/SKILL.md +200 -0
- package/skills/wok-server-getting-started/SKILL.md +123 -0
- package/skills/wok-server-getting-started/references/engineering.md +169 -0
- package/skills/wok-server-http-client/SKILL.md +164 -0
- package/skills/wok-server-i18n/SKILL.md +214 -0
- package/skills/wok-server-lock/SKILL.md +144 -0
- package/skills/wok-server-log/SKILL.md +218 -0
- package/skills/wok-server-mongodb/SKILL.md +235 -0
- package/skills/wok-server-mvc/SKILL.md +251 -0
- package/skills/wok-server-mvc/references/respond-html.md +157 -0
- package/skills/wok-server-mvc/references/sse.md +121 -0
- package/skills/wok-server-mvc/references/static-files.md +47 -0
- package/skills/wok-server-mvc/references/upload.md +62 -0
- package/skills/wok-server-mvc/references/websocket.md +30 -0
- package/skills/wok-server-mysql/SKILL.md +388 -0
- package/skills/wok-server-mysql/references/multi-datasource.md +76 -0
- package/skills/wok-server-mysql/references/version-control.md +22 -0
- package/skills/wok-server-task/SKILL.md +158 -0
- package/skills/wok-server-validate/SKILL.md +167 -0
- package/src/cache/cache.ts +118 -0
- package/src/cache/config.ts +53 -0
- package/src/cache/index.ts +27 -0
- package/src/cache/purge-task.ts +53 -0
- package/src/cache/stat.ts +47 -0
- package/src/config/convert.ts +27 -0
- package/src/config/exception.ts +8 -0
- package/src/config/index.ts +92 -0
- package/src/http-client/index.ts +202 -0
- package/src/i18n/ar.ts +16 -0
- package/src/i18n/de.ts +16 -0
- package/src/i18n/en-us.ts +16 -0
- package/src/i18n/es.ts +16 -0
- package/src/i18n/fr.ts +16 -0
- package/src/i18n/i18n.ts +230 -0
- package/src/i18n/index.ts +50 -0
- package/src/i18n/ja.ts +16 -0
- package/src/i18n/ko.ts +16 -0
- package/src/i18n/msg.ts +50 -0
- package/src/i18n/pt.ts +16 -0
- package/src/i18n/ru.ts +16 -0
- package/src/i18n/tag.ts +18 -0
- package/src/i18n/zh-HK.ts +16 -0
- package/src/i18n/zh-TW.ts +16 -0
- package/src/i18n/zh-cn.ts +16 -0
- package/src/index.ts +11 -0
- package/src/lock/index.ts +164 -0
- package/src/log/config.ts +71 -0
- package/src/log/date.ts +19 -0
- package/src/log/file.ts +215 -0
- package/src/log/index.ts +136 -0
- package/src/log/level.ts +29 -0
- package/src/log/log.ts +77 -0
- package/src/log/store.ts +31 -0
- package/src/mongodb/collection.ts +25 -0
- package/src/mongodb/config.ts +69 -0
- package/src/mongodb/doc.ts +12 -0
- package/src/mongodb/exception.ts +8 -0
- package/src/mongodb/index.ts +71 -0
- package/src/mongodb/manager/base.ts +674 -0
- package/src/mongodb/manager/index.ts +80 -0
- package/src/mongodb/manager/tx-strict.ts +153 -0
- package/src/mongodb/manager/tx.ts +34 -0
- package/src/mongodb/migration.ts +66 -0
- package/src/mvc/access-log.ts +33 -0
- package/src/mvc/config.ts +70 -0
- package/src/mvc/exchange.ts +126 -0
- package/src/mvc/handler/index.ts +4 -0
- package/src/mvc/handler/json.ts +96 -0
- package/src/mvc/handler/restful.ts +39 -0
- package/src/mvc/handler/sse.ts +90 -0
- package/src/mvc/handler/upload.ts +54 -0
- package/src/mvc/index.ts +48 -0
- package/src/mvc/interceptor.ts +12 -0
- package/src/mvc/query.ts +36 -0
- package/src/mvc/render/file.ts +148 -0
- package/src/mvc/render/html/html.ts +187 -0
- package/src/mvc/render/html/index.ts +16 -0
- package/src/mvc/render/html/style.ts +1201 -0
- package/src/mvc/render/index.ts +4 -0
- package/src/mvc/render/json.ts +24 -0
- package/src/mvc/render/text.ts +14 -0
- package/src/mvc/router.ts +13 -0
- package/src/mvc/server.ts +315 -0
- package/src/mvc/static/header.ts +86 -0
- package/src/mvc/static/index.ts +3 -0
- package/src/mvc/static/mime-type.ts +81 -0
- package/src/mvc/static/server-cache-config.ts +92 -0
- package/src/mvc/static/server-cache.ts +171 -0
- package/src/mvc/static/static-handler.ts +445 -0
- package/src/mysql/config.ts +130 -0
- package/src/mysql/exception.ts +8 -0
- package/src/mysql/index.ts +88 -0
- package/src/mysql/manager/base.ts +332 -0
- package/src/mysql/manager/index.ts +112 -0
- package/src/mysql/manager/ops/count.ts +30 -0
- package/src/mysql/manager/ops/criteria.ts +446 -0
- package/src/mysql/manager/ops/delete.ts +91 -0
- package/src/mysql/manager/ops/exist.ts +41 -0
- package/src/mysql/manager/ops/find.ts +209 -0
- package/src/mysql/manager/ops/index.ts +13 -0
- package/src/mysql/manager/ops/insert.ts +158 -0
- package/src/mysql/manager/ops/modify.ts +14 -0
- package/src/mysql/manager/ops/order-by.ts +58 -0
- package/src/mysql/manager/ops/paginate.ts +100 -0
- package/src/mysql/manager/ops/query.ts +13 -0
- package/src/mysql/manager/ops/update.ts +318 -0
- package/src/mysql/manager/ops/upsert.ts +224 -0
- package/src/mysql/manager/ops/utils.ts +24 -0
- package/src/mysql/manager/tx-strict.ts +138 -0
- package/src/mysql/manager/tx.ts +31 -0
- package/src/mysql/manager/utils.ts +75 -0
- package/src/mysql/migration.ts +149 -0
- package/src/mysql/table-info.ts +41 -0
- package/src/task/daily.ts +70 -0
- package/src/task/fixed-delay.ts +45 -0
- package/src/task/fixed-rate.ts +49 -0
- package/src/task/index.ts +4 -0
- package/src/task/task.ts +70 -0
- package/src/validation/exception.ts +27 -0
- package/src/validation/index.ts +61 -0
- package/src/validation/validator/array.ts +32 -0
- package/src/validation/validator/enum.ts +25 -0
- package/src/validation/validator/index.ts +11 -0
- package/src/validation/validator/length.ts +42 -0
- package/src/validation/validator/max-length.ts +33 -0
- package/src/validation/validator/max.ts +26 -0
- package/src/validation/validator/min-length.ts +31 -0
- package/src/validation/validator/min.ts +26 -0
- package/src/validation/validator/not-blank.ts +31 -0
- package/src/validation/validator/not-null.ts +19 -0
- package/src/validation/validator/plain-obj.ts +30 -0
- package/src/validation/validator/regexp.ts +32 -0
- package/types/cache/cache.d.ts +52 -52
- package/types/cache/config.d.ts +32 -32
- package/types/cache/index.d.ts +2 -2
- package/types/cache/purge-task.d.ts +11 -11
- package/types/cache/stat.d.ts +26 -26
- package/types/config/convert.d.ts +6 -6
- package/types/config/exception.d.ts +7 -7
- package/types/config/index.d.ts +25 -25
- package/types/http-client/index.d.ts +71 -71
- package/types/i18n/ar.d.ts +2 -2
- package/types/i18n/de.d.ts +2 -2
- package/types/i18n/en-us.d.ts +2 -2
- package/types/i18n/es.d.ts +2 -2
- package/types/i18n/fr.d.ts +2 -2
- package/types/i18n/i18n.d.ts +102 -102
- package/types/i18n/index.d.ts +9 -9
- package/types/i18n/ja.d.ts +2 -2
- package/types/i18n/ko.d.ts +2 -2
- package/types/i18n/msg.d.ts +50 -50
- package/types/i18n/pt.d.ts +2 -2
- package/types/i18n/ru.d.ts +2 -2
- package/types/i18n/tag.d.ts +11 -11
- package/types/i18n/zh-HK.d.ts +2 -2
- package/types/i18n/zh-TW.d.ts +2 -2
- package/types/i18n/zh-cn.d.ts +2 -2
- package/types/index.d.ts +11 -11
- package/types/lock/index.d.ts +64 -64
- package/types/log/config.d.ts +35 -35
- package/types/log/date.d.ts +2 -2
- package/types/log/file.d.ts +13 -13
- package/types/log/index.d.ts +53 -53
- package/types/log/level.d.ts +14 -14
- package/types/log/log.d.ts +40 -40
- package/types/log/store.d.ts +19 -19
- package/types/mongodb/collection.d.ts +25 -25
- package/types/mongodb/config.d.ts +45 -45
- package/types/mongodb/doc.d.ts +11 -11
- package/types/mongodb/exception.d.ts +7 -7
- package/types/mongodb/index.d.ts +29 -29
- package/types/mongodb/manager/base.d.ts +188 -188
- package/types/mongodb/manager/index.d.ts +38 -38
- package/types/mongodb/manager/tx-strict.d.ts +41 -41
- package/types/mongodb/manager/tx.d.ts +21 -21
- package/types/mongodb/migration.d.ts +12 -12
- package/types/mvc/access-log.d.ts +7 -7
- package/types/mvc/config.d.ts +42 -42
- package/types/mvc/exchange.d.ts +72 -72
- package/types/mvc/handler/index.d.ts +4 -3
- package/types/mvc/handler/json.d.ts +44 -44
- package/types/mvc/handler/restful.d.ts +11 -11
- package/types/mvc/handler/sse.d.ts +34 -0
- package/types/mvc/handler/upload.d.ts +36 -36
- package/types/mvc/index.d.ts +22 -22
- package/types/mvc/interceptor.d.ts +11 -11
- package/types/mvc/query.d.ts +13 -13
- package/types/mvc/render/file.d.ts +10 -10
- package/types/mvc/render/html/html.d.ts +98 -98
- package/types/mvc/render/html/index.d.ts +11 -11
- package/types/mvc/render/html/style.d.ts +1201 -1201
- package/types/mvc/render/index.d.ts +4 -4
- package/types/mvc/render/json.d.ts +17 -17
- package/types/mvc/render/text.d.ts +10 -10
- package/types/mvc/router.d.ts +11 -11
- package/types/mvc/server.d.ts +90 -90
- package/types/mvc/static/header.d.ts +27 -27
- package/types/mvc/static/index.d.ts +3 -3
- package/types/mvc/static/mime-type.d.ts +2 -2
- package/types/mvc/static/server-cache-config.d.ts +30 -30
- package/types/mvc/static/server-cache.d.ts +76 -76
- package/types/mvc/static/static-handler.d.ts +77 -77
- package/types/mysql/config.d.ts +90 -90
- package/types/mysql/exception.d.ts +7 -7
- package/types/mysql/index.d.ts +16 -16
- package/types/mysql/manager/base.d.ts +196 -165
- package/types/mysql/manager/index.d.ts +36 -36
- package/types/mysql/manager/ops/count.d.ts +13 -13
- package/types/mysql/manager/ops/criteria.d.ts +144 -134
- package/types/mysql/manager/ops/delete.d.ts +47 -46
- package/types/mysql/manager/ops/exist.d.ts +6 -6
- package/types/mysql/manager/ops/find.d.ts +87 -86
- package/types/mysql/manager/ops/index.d.ts +12 -10
- package/types/mysql/manager/ops/insert.d.ts +32 -18
- package/types/mysql/manager/ops/modify.d.ts +3 -3
- package/types/mysql/manager/ops/order-by.d.ts +38 -0
- package/types/mysql/manager/ops/paginate.d.ts +53 -36
- package/types/mysql/manager/ops/query.d.ts +3 -3
- package/types/mysql/manager/ops/update.d.ts +99 -76
- package/types/mysql/manager/ops/upsert.d.ts +36 -0
- package/types/mysql/manager/ops/utils.d.ts +5 -5
- package/types/mysql/manager/tx-strict.d.ts +36 -36
- package/types/mysql/manager/tx.d.ts +15 -15
- package/types/mysql/manager/utils.d.ts +17 -17
- package/types/mysql/migration.d.ts +8 -8
- package/types/mysql/table-info.d.ts +36 -36
- package/types/task/daily.d.ts +16 -16
- package/types/task/fixed-delay.d.ts +9 -9
- package/types/task/fixed-rate.d.ts +9 -9
- package/types/task/index.d.ts +4 -4
- package/types/task/task.d.ts +34 -34
- package/types/validation/exception.d.ts +38 -38
- package/types/validation/index.d.ts +32 -32
- package/types/validation/validator/array.d.ts +5 -5
- package/types/validation/validator/enum.d.ts +8 -8
- package/types/validation/validator/index.d.ts +11 -11
- package/types/validation/validator/length.d.ts +10 -10
- package/types/validation/validator/max-length.d.ts +8 -8
- package/types/validation/validator/max.d.ts +7 -7
- package/types/validation/validator/min-length.d.ts +6 -6
- package/types/validation/validator/min.d.ts +7 -7
- package/types/validation/validator/not-blank.d.ts +7 -7
- package/types/validation/validator/not-null.d.ts +6 -6
- package/types/validation/validator/plain-obj.d.ts +7 -7
- package/types/validation/validator/regexp.d.ts +8 -8
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { PoolConnection, RowDataPacket } from 'mysql2'
|
|
2
|
+
import { Table } from '../../table-info'
|
|
3
|
+
import { MixCriteria, buildQuery } from './criteria'
|
|
4
|
+
import { promiseQuery } from '../utils'
|
|
5
|
+
import { MysqlConfig } from '../../config'
|
|
6
|
+
import { OrderBy, buildOrderBy } from './order-by'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 按 id 查询
|
|
10
|
+
* @param connection
|
|
11
|
+
* @param mapping
|
|
12
|
+
* @param type
|
|
13
|
+
* @param id
|
|
14
|
+
*/
|
|
15
|
+
export async function findById<T>(
|
|
16
|
+
config: MysqlConfig,
|
|
17
|
+
connection: PoolConnection,
|
|
18
|
+
table: Table<T>,
|
|
19
|
+
id: string | number
|
|
20
|
+
): Promise<T | null> {
|
|
21
|
+
const res = await promiseQuery(config, connection, `select * from ?? where ?? = ?`, [
|
|
22
|
+
table.tableName,
|
|
23
|
+
table.id,
|
|
24
|
+
id
|
|
25
|
+
])
|
|
26
|
+
const rows = res as RowDataPacket[]
|
|
27
|
+
if (!rows.length) {
|
|
28
|
+
return null
|
|
29
|
+
}
|
|
30
|
+
return rows[0] as T
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* 查询表中所有数据。需谨慎操作,全表查询有可能会产生大列表问题。
|
|
35
|
+
* @param connection
|
|
36
|
+
* @param mapping
|
|
37
|
+
* @param type
|
|
38
|
+
* @returns
|
|
39
|
+
*/
|
|
40
|
+
export async function findAll<T>(
|
|
41
|
+
config: MysqlConfig,
|
|
42
|
+
connection: PoolConnection,
|
|
43
|
+
table: Table<T>
|
|
44
|
+
): Promise<T[]> {
|
|
45
|
+
const res = await promiseQuery(config, connection, `select * from ??`, [table.tableName])
|
|
46
|
+
return res as RowDataPacket[] as T[]
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface FindOpts<T> {
|
|
50
|
+
/**
|
|
51
|
+
* 表
|
|
52
|
+
*/
|
|
53
|
+
table: Table<T>
|
|
54
|
+
/**
|
|
55
|
+
* 查询条件
|
|
56
|
+
* @param criteria
|
|
57
|
+
* @returns
|
|
58
|
+
*/
|
|
59
|
+
criteria?: MixCriteria<T>
|
|
60
|
+
/**
|
|
61
|
+
* 偏移,需要 limit 有值才可以
|
|
62
|
+
*/
|
|
63
|
+
offset?: number
|
|
64
|
+
/**
|
|
65
|
+
* 限制返回的数量
|
|
66
|
+
*/
|
|
67
|
+
limit?: number
|
|
68
|
+
/**
|
|
69
|
+
* 排序规则,按先后顺序放入,每个规则是一个元组,第一个元素是字段名称,第二个元素是顺序
|
|
70
|
+
*/
|
|
71
|
+
orderBy?: OrderBy<T>
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 条件查询
|
|
75
|
+
* @param opts
|
|
76
|
+
* @returns
|
|
77
|
+
*/
|
|
78
|
+
export async function find<T>(
|
|
79
|
+
config: MysqlConfig,
|
|
80
|
+
conn: PoolConnection,
|
|
81
|
+
opts: FindOpts<T>
|
|
82
|
+
): Promise<T[]> {
|
|
83
|
+
let query = opts.criteria ? buildQuery(opts.criteria) : undefined
|
|
84
|
+
const values: any[] = []
|
|
85
|
+
let sql = `select * from ?? `
|
|
86
|
+
values.push(opts.table.tableName)
|
|
87
|
+
if (query) {
|
|
88
|
+
sql += ` where ${query.sql} `
|
|
89
|
+
values.push(...query.values)
|
|
90
|
+
}
|
|
91
|
+
// 排序
|
|
92
|
+
if (opts.orderBy && opts.orderBy.length) {
|
|
93
|
+
const ob = buildOrderBy(opts.orderBy)
|
|
94
|
+
sql += ob.sql
|
|
95
|
+
values.push(...ob.values)
|
|
96
|
+
}
|
|
97
|
+
// 数量限制
|
|
98
|
+
if (opts.limit) {
|
|
99
|
+
sql += ` limit ${opts.limit} `
|
|
100
|
+
if (opts.offset) {
|
|
101
|
+
sql += ` offset ${opts.offset}`
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const res = await promiseQuery(config, conn, sql, values)
|
|
105
|
+
return res as RowDataPacket[] as T[]
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* 指定字段条件查询选项
|
|
110
|
+
*/
|
|
111
|
+
export interface FindSelectOpts<T, K extends keyof T> extends FindOpts<T> {
|
|
112
|
+
/**
|
|
113
|
+
* 要查询的字段
|
|
114
|
+
*/
|
|
115
|
+
select: K[]
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* 查询指定的字段,返回值类型与选择的字段有关
|
|
120
|
+
* @param onfig
|
|
121
|
+
* @param conn
|
|
122
|
+
* @param opts
|
|
123
|
+
*/
|
|
124
|
+
export async function findSelect<T, K extends keyof T>(
|
|
125
|
+
config: MysqlConfig,
|
|
126
|
+
conn: PoolConnection,
|
|
127
|
+
opts: FindSelectOpts<T, K>
|
|
128
|
+
): Promise<Array<Pick<T, K>>> {
|
|
129
|
+
let query = opts.criteria ? buildQuery(opts.criteria) : undefined
|
|
130
|
+
const values: any[] = []
|
|
131
|
+
let sql = `select ${opts.select.map(() => '??').join(',')} from ?? `
|
|
132
|
+
values.push(...opts.select, opts.table.tableName)
|
|
133
|
+
if (query) {
|
|
134
|
+
sql += ` where ${query.sql} `
|
|
135
|
+
values.push(...query.values)
|
|
136
|
+
}
|
|
137
|
+
// 排序
|
|
138
|
+
if (opts.orderBy && opts.orderBy.length) {
|
|
139
|
+
const ob = buildOrderBy(opts.orderBy)
|
|
140
|
+
sql += ob.sql
|
|
141
|
+
values.push(...ob.values)
|
|
142
|
+
}
|
|
143
|
+
// 数量限制
|
|
144
|
+
if (opts.limit) {
|
|
145
|
+
sql += ` limit ${opts.limit} `
|
|
146
|
+
if (opts.offset) {
|
|
147
|
+
sql += ` offset ${opts.offset}`
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const res = await promiseQuery(config, conn, sql, values)
|
|
151
|
+
return res as RowDataPacket[] as Pick<T, K>[]
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 根据 id 列表查询记录
|
|
155
|
+
* @param connection
|
|
156
|
+
* @param table
|
|
157
|
+
* @param ids
|
|
158
|
+
* @returns
|
|
159
|
+
*/
|
|
160
|
+
export async function findByIdIn<T>(
|
|
161
|
+
config: MysqlConfig,
|
|
162
|
+
connection: PoolConnection,
|
|
163
|
+
table: Table<T>,
|
|
164
|
+
ids: Array<string | number>
|
|
165
|
+
): Promise<T[]> {
|
|
166
|
+
if (!ids.length) {
|
|
167
|
+
return []
|
|
168
|
+
}
|
|
169
|
+
return find(config, connection, {
|
|
170
|
+
table,
|
|
171
|
+
criteria: c => c.in(table.id, ids)
|
|
172
|
+
})
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* 查找符合条件的第一条记录
|
|
177
|
+
* @param conn
|
|
178
|
+
* @param table
|
|
179
|
+
* @param criteria
|
|
180
|
+
* @returns
|
|
181
|
+
*/
|
|
182
|
+
export async function findFirst<T>(
|
|
183
|
+
config: MysqlConfig,
|
|
184
|
+
conn: PoolConnection,
|
|
185
|
+
table: Table<T>,
|
|
186
|
+
criteria?: MixCriteria<T>,
|
|
187
|
+
/**
|
|
188
|
+
* 排序规则,按先后顺序放入,每个规则是一个元组,第一个元素是字段名称,第二个元素是顺序
|
|
189
|
+
*/
|
|
190
|
+
orderBy?: OrderBy<T>
|
|
191
|
+
): Promise<T | null> {
|
|
192
|
+
let query = criteria ? buildQuery(criteria) : undefined
|
|
193
|
+
let sql = `select * from ?? `
|
|
194
|
+
const values: any[] = [table.tableName]
|
|
195
|
+
if (query) {
|
|
196
|
+
sql += ` where ${query.sql} `
|
|
197
|
+
values.push(...query.values)
|
|
198
|
+
}
|
|
199
|
+
// 排序
|
|
200
|
+
if (orderBy && orderBy.length) {
|
|
201
|
+
const ob = buildOrderBy(orderBy)
|
|
202
|
+
sql += ob.sql
|
|
203
|
+
values.push(...ob.values)
|
|
204
|
+
}
|
|
205
|
+
sql += ' limit 1'
|
|
206
|
+
const res = await promiseQuery(config, conn, sql, values)
|
|
207
|
+
const list = res as RowDataPacket[] as T[]
|
|
208
|
+
return list.length ? list[0] : null
|
|
209
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// 各类操作封装
|
|
2
|
+
export * from './count'
|
|
3
|
+
export * from './criteria'
|
|
4
|
+
export * from './delete'
|
|
5
|
+
export * from './exist'
|
|
6
|
+
export * from './find'
|
|
7
|
+
export * from './insert'
|
|
8
|
+
export * from './modify'
|
|
9
|
+
export * from './order-by'
|
|
10
|
+
export * from './upsert'
|
|
11
|
+
export * from './paginate'
|
|
12
|
+
export * from './query'
|
|
13
|
+
export * from './update'
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { PoolConnection, ResultSetHeader } from 'mysql2'
|
|
2
|
+
import { MysqlException } from '../../exception'
|
|
3
|
+
import { Table } from '../../table-info'
|
|
4
|
+
import { promiseQuery } from '../utils'
|
|
5
|
+
import { MysqlConfig } from '../../config'
|
|
6
|
+
import { processColumnValue } from './utils'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 插入值类型,支持在 INSERT VALUES 中使用表达式
|
|
10
|
+
*/
|
|
11
|
+
export type InsertValue<T> = {
|
|
12
|
+
[K in keyof T]?:
|
|
13
|
+
| T[K]
|
|
14
|
+
| ['now']
|
|
15
|
+
| ['set', T[K]]
|
|
16
|
+
| ['expr', string]
|
|
17
|
+
| ['expr', string, any[]]
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 处理 insert value,支持表达式
|
|
22
|
+
* @returns { frag: SQL 片段, values: 参数值数组 }
|
|
23
|
+
*/
|
|
24
|
+
export function processInsertValue(value: any): { frag: string; values: any[] } {
|
|
25
|
+
if (Array.isArray(value)) {
|
|
26
|
+
if (value[0] === 'now') {
|
|
27
|
+
return { frag: 'NOW()', values: [] }
|
|
28
|
+
}
|
|
29
|
+
if (value[0] === 'set') {
|
|
30
|
+
return { frag: '?', values: [processColumnValue(value[1])] }
|
|
31
|
+
}
|
|
32
|
+
if (value[0] === 'expr') {
|
|
33
|
+
return { frag: value[1], values: value[2] || [] }
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { frag: '?', values: [processColumnValue(value)] }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* 为表插入数据
|
|
41
|
+
* @param connection
|
|
42
|
+
* @param table
|
|
43
|
+
* @param data
|
|
44
|
+
* @returns
|
|
45
|
+
*/
|
|
46
|
+
export async function insert<T>(
|
|
47
|
+
config: MysqlConfig,
|
|
48
|
+
connection: PoolConnection,
|
|
49
|
+
table: Table<T>,
|
|
50
|
+
data: InsertValue<T>
|
|
51
|
+
): Promise<T> {
|
|
52
|
+
// 列信息,使用 set 防止 columns 中重复配置 id 和更新创建时间列
|
|
53
|
+
let columnsSet: Set<keyof T> = new Set()
|
|
54
|
+
// 判定下 id ,如果有值,才在 insert 语句中出现 id 列,否则不出现
|
|
55
|
+
if (data[table.id]) {
|
|
56
|
+
columnsSet.add(table.id)
|
|
57
|
+
}
|
|
58
|
+
table.columns.forEach(col => columnsSet.add(col))
|
|
59
|
+
if (table.createdDate) {
|
|
60
|
+
const createdData = table.createdDate.type === 'date' ? new Date() : new Date().getTime()
|
|
61
|
+
data[table.createdDate.column] = createdData as any
|
|
62
|
+
columnsSet.add(table.createdDate.column)
|
|
63
|
+
}
|
|
64
|
+
if (table.updatedDate) {
|
|
65
|
+
const updatedDate = table.updatedDate.type === 'date' ? new Date() : new Date().getTime()
|
|
66
|
+
data[table.updatedDate.column] = updatedDate as any
|
|
67
|
+
columnsSet.add(table.updatedDate.column)
|
|
68
|
+
}
|
|
69
|
+
const columns = Array.from(columnsSet)
|
|
70
|
+
// 构建 sql,逐列处理以支持表达式
|
|
71
|
+
const fragList: string[] = []
|
|
72
|
+
const insertValues: any[] = []
|
|
73
|
+
for (const col of columns) {
|
|
74
|
+
const { frag, values: vs } = processInsertValue(data[col])
|
|
75
|
+
fragList.push(frag)
|
|
76
|
+
insertValues.push(...vs)
|
|
77
|
+
}
|
|
78
|
+
const sql = `insert into ??(${columns.map(() => '??').join(',')}) values(${fragList.join(',')})`
|
|
79
|
+
const values: any[] = [table.tableName, ...columns, ...insertValues]
|
|
80
|
+
const res = await promiseQuery(config, connection, sql, values)
|
|
81
|
+
const packet = res as ResultSetHeader
|
|
82
|
+
if (packet.affectedRows !== 1) {
|
|
83
|
+
throw new MysqlException(
|
|
84
|
+
`Insert failed,table:${table.tableName},primary key: ${data[table.id]}`
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
// 自动生成的id处理
|
|
88
|
+
if (packet.insertId && (data[table.id] === undefined || data[table.id] === null)) {
|
|
89
|
+
data[table.id] = packet.insertId as any
|
|
90
|
+
}
|
|
91
|
+
return data as unknown as T
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 一次插入多条记录
|
|
95
|
+
* @param connection 连接
|
|
96
|
+
* @param table 表
|
|
97
|
+
* @param list 要插入的记录列表
|
|
98
|
+
*/
|
|
99
|
+
export async function insertMany<T>(
|
|
100
|
+
config: MysqlConfig,
|
|
101
|
+
connection: PoolConnection,
|
|
102
|
+
table: Table<T>,
|
|
103
|
+
list: InsertValue<T>[]
|
|
104
|
+
): Promise<void> {
|
|
105
|
+
if (!list.length) {
|
|
106
|
+
return
|
|
107
|
+
}
|
|
108
|
+
// 列信息,使用 set 防止 columns 中重复配置 id 和更新创建时间列
|
|
109
|
+
let columnsSet: Set<keyof T> = new Set()
|
|
110
|
+
// 批量插入必须统一使用 id 或不使用 id,以第一条记录为准
|
|
111
|
+
if (list[0][table.id]) {
|
|
112
|
+
columnsSet.add(table.id)
|
|
113
|
+
}
|
|
114
|
+
table.columns.forEach(col => columnsSet.add(col))
|
|
115
|
+
let createdData: Date | number | undefined = undefined
|
|
116
|
+
if (table.createdDate) {
|
|
117
|
+
createdData = table.createdDate.type === 'date' ? new Date() : new Date().getTime()
|
|
118
|
+
columnsSet.add(table.createdDate.column)
|
|
119
|
+
}
|
|
120
|
+
let updatedDate: Date | number | undefined = undefined
|
|
121
|
+
if (table.updatedDate) {
|
|
122
|
+
updatedDate = table.updatedDate.type === 'date' ? new Date() : new Date().getTime()
|
|
123
|
+
columnsSet.add(table.updatedDate.column)
|
|
124
|
+
}
|
|
125
|
+
const columns = Array.from(columnsSet)
|
|
126
|
+
// 构建 sql
|
|
127
|
+
let sql = `insert into ??(${columns.map(() => '??').join(',')}) values`
|
|
128
|
+
const values: any[] = [table.tableName, ...columns]
|
|
129
|
+
list.forEach((data, idx) => {
|
|
130
|
+
if (idx > 0) {
|
|
131
|
+
sql += ','
|
|
132
|
+
}
|
|
133
|
+
const fragList: string[] = []
|
|
134
|
+
const rowValues: any[] = []
|
|
135
|
+
if (table.createdDate) {
|
|
136
|
+
data[table.createdDate.column] = createdData as any
|
|
137
|
+
}
|
|
138
|
+
if (table.updatedDate) {
|
|
139
|
+
data[table.updatedDate.column] = updatedDate as any
|
|
140
|
+
}
|
|
141
|
+
for (const col of columns) {
|
|
142
|
+
const { frag, values: vs } = processInsertValue(data[col])
|
|
143
|
+
fragList.push(frag)
|
|
144
|
+
rowValues.push(...vs)
|
|
145
|
+
}
|
|
146
|
+
sql += `(${fragList.join(',')})`
|
|
147
|
+
values.push(...rowValues)
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
const res = await promiseQuery(config, connection, sql, values)
|
|
151
|
+
const rsh = res as ResultSetHeader
|
|
152
|
+
if (rsh.affectedRows !== list.length) {
|
|
153
|
+
throw new MysqlException(
|
|
154
|
+
`Insert many for table ${table.tableName} failed,expected to insert ${list.length} records, actually ${rsh.affectedRows}.`
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
// insert 插入多条记录是不会返回生成的 id 的,所以就没有办法自动处理
|
|
158
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PoolConnection, ResultSetHeader } from 'mysql2'
|
|
2
|
+
import { promiseQuery } from '../utils'
|
|
3
|
+
import { MysqlConfig } from '../../config'
|
|
4
|
+
|
|
5
|
+
export async function modify(
|
|
6
|
+
config: MysqlConfig,
|
|
7
|
+
connection: PoolConnection,
|
|
8
|
+
sql: string,
|
|
9
|
+
values?: any[]
|
|
10
|
+
): Promise<number> {
|
|
11
|
+
const res = await promiseQuery(config, connection, sql, values || [])
|
|
12
|
+
const pck = res as ResultSetHeader
|
|
13
|
+
return pck.affectedRows
|
|
14
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 排序规则类型.
|
|
3
|
+
*
|
|
4
|
+
* T 为表类型.
|
|
5
|
+
*
|
|
6
|
+
* 普通列排序:
|
|
7
|
+
* [keyof T, 'asc' | 'desc']
|
|
8
|
+
* 例: ['balance', 'asc'] → ORDER BY `balance` asc
|
|
9
|
+
*
|
|
10
|
+
* 自定义表达式排序:
|
|
11
|
+
* ['expr', SQL片段, 参数值数组, 'asc' | 'desc']
|
|
12
|
+
* 例: ['expr', '?? * ?', ['balance', 2], 'desc']
|
|
13
|
+
* → ORDER BY `balance` * 2 desc
|
|
14
|
+
*
|
|
15
|
+
* 例: ['expr', 'CHAR_LENGTH(??)', ['name'], 'desc']
|
|
16
|
+
* → ORDER BY CHAR_LENGTH(`name`) desc
|
|
17
|
+
*
|
|
18
|
+
* 例: ['expr', 'VECTOR_DISTANCE(??, STRING_TO_VECTOR(?))', ['content_vec', embedding], 'asc']
|
|
19
|
+
* → ORDER BY VECTOR_DISTANCE(`content_vec`, STRING_TO_VECTOR(?)) asc
|
|
20
|
+
*
|
|
21
|
+
* 混合使用:
|
|
22
|
+
* [
|
|
23
|
+
* ['active', 'asc'],
|
|
24
|
+
* ['expr', '?? * ?', ['balance', 2], 'desc']
|
|
25
|
+
* ]
|
|
26
|
+
* → ORDER BY `active` asc , `balance` * 2 desc
|
|
27
|
+
*/
|
|
28
|
+
export type OrderBy<T> = Array<
|
|
29
|
+
| [keyof T, 'asc' | 'desc']
|
|
30
|
+
| ['expr', string, any[], 'asc' | 'desc']
|
|
31
|
+
>
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* 构建 ORDER BY 子句.
|
|
35
|
+
*
|
|
36
|
+
* @param orderBy 排序规则
|
|
37
|
+
* @returns { sql: SQL 片段, values: 参数值数组 }
|
|
38
|
+
*/
|
|
39
|
+
export function buildOrderBy<T>(orderBy: OrderBy<T>): { sql: string; values: any[] } {
|
|
40
|
+
const fragments: string[] = []
|
|
41
|
+
const values: any[] = []
|
|
42
|
+
|
|
43
|
+
orderBy.forEach((item, idx) => {
|
|
44
|
+
const prefix = idx === 0 ? ' order by ' : ' , '
|
|
45
|
+
|
|
46
|
+
if (item.length === 4 && item[0] === 'expr') {
|
|
47
|
+
const [, exprSql, exprValues, sort] = item as ['expr', string, any[], 'asc' | 'desc']
|
|
48
|
+
fragments.push(`${prefix}${exprSql} ${sort}`)
|
|
49
|
+
values.push(...exprValues)
|
|
50
|
+
} else {
|
|
51
|
+
const [field, sort] = item as [keyof T, 'asc' | 'desc']
|
|
52
|
+
fragments.push(`${prefix}?? ${sort}`)
|
|
53
|
+
values.push(field)
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
return { sql: fragments.join(''), values }
|
|
58
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { PoolConnection } from 'mysql2'
|
|
2
|
+
import { Table } from '../../table-info'
|
|
3
|
+
import { count } from './count'
|
|
4
|
+
import { MixCriteria } from './criteria'
|
|
5
|
+
import { find, findSelect } from './find'
|
|
6
|
+
import { MysqlConfig } from '../../config'
|
|
7
|
+
import { OrderBy } from './order-by'
|
|
8
|
+
|
|
9
|
+
export interface MysqlPaginateOpts<T> {
|
|
10
|
+
/**
|
|
11
|
+
* 表
|
|
12
|
+
*/
|
|
13
|
+
table: Table<T>
|
|
14
|
+
/**
|
|
15
|
+
* 查询条件
|
|
16
|
+
* @param criteria
|
|
17
|
+
* @returns
|
|
18
|
+
*/
|
|
19
|
+
criteria?: MixCriteria<T>
|
|
20
|
+
/**
|
|
21
|
+
* 而码,默认1
|
|
22
|
+
*/
|
|
23
|
+
pn?: number
|
|
24
|
+
/**
|
|
25
|
+
* 每页的数据量大小,默认 20, 必须在 1-1000 之间
|
|
26
|
+
*/
|
|
27
|
+
pz?: number
|
|
28
|
+
/**
|
|
29
|
+
* 排序规则,按先后顺序放入,每个规则是一个元组,第一个元素是字段名称,第二个元素是顺序
|
|
30
|
+
*/
|
|
31
|
+
orderBy?: OrderBy<T>
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* mysql 分页查询结果
|
|
35
|
+
*/
|
|
36
|
+
export interface MysqlPage<T> {
|
|
37
|
+
total: number
|
|
38
|
+
list: T[]
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export async function paginate<T>(
|
|
42
|
+
config: MysqlConfig,
|
|
43
|
+
conn: PoolConnection,
|
|
44
|
+
opts: MysqlPaginateOpts<T>
|
|
45
|
+
): Promise<MysqlPage<T>> {
|
|
46
|
+
const pn = opts.pn && opts.pn >= 1 ? opts.pn : 1
|
|
47
|
+
const limit = opts.pz && opts.pz >= 1 && opts.pz <= 1000 ? opts.pz : 20
|
|
48
|
+
const offset = (pn - 1) * limit
|
|
49
|
+
const list = await find(config, conn, {
|
|
50
|
+
table: opts.table,
|
|
51
|
+
criteria: opts.criteria,
|
|
52
|
+
offset,
|
|
53
|
+
limit,
|
|
54
|
+
orderBy: opts.orderBy
|
|
55
|
+
})
|
|
56
|
+
const total = await count(config, conn, opts.table, opts.criteria)
|
|
57
|
+
return {
|
|
58
|
+
total,
|
|
59
|
+
list
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* 指定字段分页查询选项
|
|
65
|
+
*/
|
|
66
|
+
export interface MysqlPaginateSelectOpts<T, K extends keyof T> extends MysqlPaginateOpts<T> {
|
|
67
|
+
/**
|
|
68
|
+
* 要查询的字段
|
|
69
|
+
*/
|
|
70
|
+
select: K[]
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* 指定字段分页查询
|
|
75
|
+
* @param config
|
|
76
|
+
* @param conn
|
|
77
|
+
* @param opts
|
|
78
|
+
*/
|
|
79
|
+
export async function paginateSelect<T, K extends keyof T>(
|
|
80
|
+
config: MysqlConfig,
|
|
81
|
+
conn: PoolConnection,
|
|
82
|
+
opts: MysqlPaginateSelectOpts<T, K>
|
|
83
|
+
): Promise<MysqlPage<Pick<T, K>>> {
|
|
84
|
+
const pn = opts.pn && opts.pn >= 1 ? opts.pn : 1
|
|
85
|
+
const limit = opts.pz && opts.pz >= 1 && opts.pz <= 1000 ? opts.pz : 20
|
|
86
|
+
const offset = (pn - 1) * limit
|
|
87
|
+
const list = await findSelect(config, conn, {
|
|
88
|
+
table: opts.table,
|
|
89
|
+
criteria: opts.criteria,
|
|
90
|
+
offset,
|
|
91
|
+
limit,
|
|
92
|
+
orderBy: opts.orderBy,
|
|
93
|
+
select: opts.select
|
|
94
|
+
})
|
|
95
|
+
const total = await count(config, conn, opts.table, opts.criteria)
|
|
96
|
+
return {
|
|
97
|
+
total,
|
|
98
|
+
list
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PoolConnection, RowDataPacket } from 'mysql2'
|
|
2
|
+
import { promiseQuery } from '../utils'
|
|
3
|
+
import { MysqlConfig } from '../../config'
|
|
4
|
+
|
|
5
|
+
export async function query<T>(
|
|
6
|
+
config: MysqlConfig,
|
|
7
|
+
connection: PoolConnection,
|
|
8
|
+
sql: string,
|
|
9
|
+
values?: any[]
|
|
10
|
+
): Promise<T[]> {
|
|
11
|
+
const res = await promiseQuery(config, connection, sql, values || [])
|
|
12
|
+
return res as RowDataPacket[] as T[]
|
|
13
|
+
}
|