@asla/yoursql 0.8.1 → 0.8.3
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/dist/client/DbCursor.d.ts +14 -0
- package/dist/client/DbCursor.js +21 -0
- package/dist/client/DbPoolConnection.d.ts +29 -0
- package/dist/client/DbPoolConnection.js +56 -0
- package/dist/client/DbPoolTransaction.d.ts +29 -0
- package/dist/client/DbPoolTransaction.js +98 -0
- package/dist/client/DbQuery.d.ts +68 -0
- package/dist/client/DbQuery.js +30 -0
- package/dist/client/errors.d.ts +9 -0
- package/dist/client/errors.js +14 -0
- package/dist/client/interfaces.d.ts +66 -0
- package/dist/client/mod.d.ts +7 -0
- package/dist/client/mod.js +5 -0
- package/dist/sql_gen/mod.js +19 -0
- package/dist/sql_gen/select/DbTable.js +70 -0
- package/dist/sql_gen/select/TableQuery.js +68 -0
- package/dist/sql_gen/select/_statement.js +60 -0
- package/dist/sql_gen/select/query_chain_abstract.js +27 -0
- package/dist/sql_gen/select/query_chain_insert.js +64 -0
- package/dist/sql_gen/select/query_chain_select.js +105 -0
- package/dist/sql_gen/sql_value/db_type.js +40 -0
- package/dist/sql_gen/sql_value/sql_value.js +304 -0
- package/dist/sql_gen/util.js +166 -0
- package/dist/sql_gen/your_table/checker.js +82 -0
- package/dist/sql_gen/your_table/infer_db_type.js +76 -0
- package/dist/sql_gen/your_table/table.js +33 -0
- package/package.json +5 -2
- package/dist/mod.js +0 -1081
- /package/dist/{mod.d.ts → sql_gen/mod.d.ts} +0 -0
- /package/dist/{select → sql_gen/select}/DbTable.d.ts +0 -0
- /package/dist/{select → sql_gen/select}/TableQuery.d.ts +0 -0
- /package/dist/{select → sql_gen/select}/_statement.d.ts +0 -0
- /package/dist/{select → sql_gen/select}/query_chain_abstract.d.ts +0 -0
- /package/dist/{select → sql_gen/select}/query_chain_insert.d.ts +0 -0
- /package/dist/{select → sql_gen/select}/query_chain_select.d.ts +0 -0
- /package/dist/{select → sql_gen/select}/type.d.ts +0 -0
- /package/dist/{sql_value → sql_gen/sql_value}/db_type.d.ts +0 -0
- /package/dist/{sql_value → sql_gen/sql_value}/sql_value.d.ts +0 -0
- /package/dist/{util.d.ts → sql_gen/util.d.ts} +0 -0
- /package/dist/{your_table → sql_gen/your_table}/checker.d.ts +0 -0
- /package/dist/{your_table → sql_gen/your_table}/infer_db_type.d.ts +0 -0
- /package/dist/{your_table → sql_gen/your_table}/mod.d.ts +0 -0
- /package/dist/{your_table → sql_gen/your_table}/table.d.ts +0 -0
package/dist/mod.js
DELETED
|
@@ -1,1081 +0,0 @@
|
|
|
1
|
-
/******************************************************************************
|
|
2
|
-
Copyright (c) Microsoft Corporation.
|
|
3
|
-
|
|
4
|
-
Permission to use, copy, modify, and/or distribute this software for any
|
|
5
|
-
purpose with or without fee is hereby granted.
|
|
6
|
-
|
|
7
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
8
|
-
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
9
|
-
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
10
|
-
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
11
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
12
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
13
|
-
PERFORMANCE OF THIS SOFTWARE.
|
|
14
|
-
***************************************************************************** */
|
|
15
|
-
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
function __classPrivateFieldGet(receiver, state, kind, f) {
|
|
19
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
20
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
21
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function __classPrivateFieldSet(receiver, state, value, kind, f) {
|
|
25
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
26
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
27
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
28
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
32
|
-
var e = new Error(message);
|
|
33
|
-
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
function condition(conditions, type = "AND") {
|
|
37
|
-
if (typeof conditions === "function")
|
|
38
|
-
conditions = conditions();
|
|
39
|
-
if (!conditions)
|
|
40
|
-
return;
|
|
41
|
-
if (typeof conditions === "string")
|
|
42
|
-
return conditions;
|
|
43
|
-
else {
|
|
44
|
-
if (conditions.length) {
|
|
45
|
-
let sql = "";
|
|
46
|
-
type = " " + type + " ";
|
|
47
|
-
sql += conditions[0];
|
|
48
|
-
for (let i = 1; i < conditions.length; i++)
|
|
49
|
-
sql += type + conditions[i];
|
|
50
|
-
return sql;
|
|
51
|
-
}
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
function createUpdateSetFromObject(set) {
|
|
56
|
-
const updateKey = Object.keys(set);
|
|
57
|
-
let i = 0;
|
|
58
|
-
let key;
|
|
59
|
-
let value;
|
|
60
|
-
let sql;
|
|
61
|
-
for (; i < updateKey.length; i++) {
|
|
62
|
-
key = updateKey[i];
|
|
63
|
-
value = set[key];
|
|
64
|
-
if (value === undefined)
|
|
65
|
-
continue;
|
|
66
|
-
if (typeof value === "string") {
|
|
67
|
-
if (value) {
|
|
68
|
-
sql = "SET\n" + key + "= " + value;
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
else
|
|
73
|
-
throw new TypeError(`key ${key} 类型错误(${typeof value})`);
|
|
74
|
-
}
|
|
75
|
-
if (sql) {
|
|
76
|
-
i++;
|
|
77
|
-
for (; i < updateKey.length; i++) {
|
|
78
|
-
key = updateKey[i];
|
|
79
|
-
value = set[key];
|
|
80
|
-
if (value === undefined)
|
|
81
|
-
continue;
|
|
82
|
-
if (typeof value === "string") {
|
|
83
|
-
if (value)
|
|
84
|
-
sql += "," + key + "= " + value;
|
|
85
|
-
}
|
|
86
|
-
else
|
|
87
|
-
throw new TypeError(`key ${key} 类型错误(${typeof value})`);
|
|
88
|
-
}
|
|
89
|
-
return sql;
|
|
90
|
-
}
|
|
91
|
-
else
|
|
92
|
-
throw new Error("值不能为空");
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* 获取对象数组中的 key 的集合
|
|
97
|
-
* @public
|
|
98
|
-
* @param keepUndefinedKey - 是否保留值为 undefined 的 key
|
|
99
|
-
*/
|
|
100
|
-
function getObjectListKeys(objectList, keepUndefinedKey) {
|
|
101
|
-
let keys = new Set();
|
|
102
|
-
for (let i = 0; i < objectList.length; i++) {
|
|
103
|
-
let obj = objectList[i];
|
|
104
|
-
let hasKeys = Object.keys(obj);
|
|
105
|
-
let k;
|
|
106
|
-
for (let j = 0; j < hasKeys.length; j++) {
|
|
107
|
-
k = hasKeys[j];
|
|
108
|
-
if (typeof k !== "string")
|
|
109
|
-
continue;
|
|
110
|
-
if (!keepUndefinedKey && obj[k] === undefined)
|
|
111
|
-
continue;
|
|
112
|
-
keys.add(k);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return keys;
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* 生成 WHERE 语句
|
|
119
|
-
* @public
|
|
120
|
-
* @example
|
|
121
|
-
* ```ts
|
|
122
|
-
* where(['a=1','b=2']) // "\nWHERE a=1 AND b=2"
|
|
123
|
-
* where(['a=1','b=2'],"OR") // "\nWHERE a=1 OR b=2"
|
|
124
|
-
* where("a=1 OR b=2") // "\nWHERE a=1 OR b=2"
|
|
125
|
-
* where(()=>"a=1 OR b=2") // "\nWHERE a=1 AND b=2"
|
|
126
|
-
* where([]) // ""
|
|
127
|
-
* where(undefined) // ""
|
|
128
|
-
* ```
|
|
129
|
-
*/
|
|
130
|
-
function where(conditions, type) {
|
|
131
|
-
const sql = condition(conditions, type);
|
|
132
|
-
if (sql)
|
|
133
|
-
return "\nWHERE " + sql;
|
|
134
|
-
return "";
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
*
|
|
138
|
-
* 生成 HAVING 语句
|
|
139
|
-
* @public
|
|
140
|
-
*/
|
|
141
|
-
function having(conditions, type) {
|
|
142
|
-
const sql = condition(conditions, type);
|
|
143
|
-
if (sql)
|
|
144
|
-
return "\nHAVING " + sql;
|
|
145
|
-
return "";
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* @public
|
|
149
|
-
* @example
|
|
150
|
-
* ```ts
|
|
151
|
-
* selectColumns({c1: true, c2: "count(*)", c3: "column"}) // "c1,count(*) AS c2,column as c3"
|
|
152
|
-
* selectColumns("c1,count(*) AS c2,column as c3") // "c1,count(*) AS c2,column as c3"
|
|
153
|
-
* ```
|
|
154
|
-
*/
|
|
155
|
-
function selectColumns(columns) {
|
|
156
|
-
if (typeof columns === "function")
|
|
157
|
-
columns = columns();
|
|
158
|
-
switch (typeof columns) {
|
|
159
|
-
case "string":
|
|
160
|
-
return columns;
|
|
161
|
-
case "object": {
|
|
162
|
-
if (columns instanceof Array) {
|
|
163
|
-
if (columns.length === 0)
|
|
164
|
-
throw new Error("没有选择任何列");
|
|
165
|
-
return columns.join(",");
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
let sql = "";
|
|
169
|
-
const keys = Object.keys(columns);
|
|
170
|
-
if (keys.length === 0)
|
|
171
|
-
throw new Error("没有选择任何列");
|
|
172
|
-
let k = keys[0];
|
|
173
|
-
let v = columns[k];
|
|
174
|
-
if (typeof v === "string")
|
|
175
|
-
sql += v + " AS " + k;
|
|
176
|
-
else
|
|
177
|
-
sql += k;
|
|
178
|
-
for (let i = 1; i < keys.length; i++) {
|
|
179
|
-
k = keys[i];
|
|
180
|
-
v = columns[k];
|
|
181
|
-
sql += ",";
|
|
182
|
-
if (typeof v === "string")
|
|
183
|
-
sql += v + " AS " + k;
|
|
184
|
-
else
|
|
185
|
-
sql += k;
|
|
186
|
-
}
|
|
187
|
-
return sql;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
default:
|
|
191
|
-
throw new TypeError("columns 应为 string 或 object 类型");
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* 生成 ORDER BY 语句, d
|
|
196
|
-
* @public
|
|
197
|
-
* @example
|
|
198
|
-
* ```ts
|
|
199
|
-
* // 以下生成 "\nORDER BY age DESC NULLS FIRST,num ASC"
|
|
200
|
-
* orderBy("age DESC NULLS FIRST,num ASC");
|
|
201
|
-
* orderBy(["age DESC NULLS FIRST", "num ASC"]);
|
|
202
|
-
* orderBy([
|
|
203
|
-
* { key: "age", asc: false, nullLast: false },
|
|
204
|
-
* { key: "num", asc: true },
|
|
205
|
-
* ]);
|
|
206
|
-
* orderBy({ age: "DESC NULLS FIRST", num: true });
|
|
207
|
-
*
|
|
208
|
-
* orderBy([]) // ""
|
|
209
|
-
* orderBy({}) // ""
|
|
210
|
-
* ```
|
|
211
|
-
*/
|
|
212
|
-
function orderBy(by) {
|
|
213
|
-
if (typeof by === "function")
|
|
214
|
-
by = by();
|
|
215
|
-
let sql = "";
|
|
216
|
-
if (!by)
|
|
217
|
-
return sql;
|
|
218
|
-
if (typeof by === "string") {
|
|
219
|
-
sql += "\nORDER BY " + by;
|
|
220
|
-
}
|
|
221
|
-
else if (by instanceof Array) {
|
|
222
|
-
if (by.length) {
|
|
223
|
-
sql += "\nORDER BY " + handlerOrderValue(by[0]);
|
|
224
|
-
for (let i = 1; i < by.length; i++)
|
|
225
|
-
sql += "," + handlerOrderValue(by[i]);
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
else {
|
|
229
|
-
let keys = Object.keys(by);
|
|
230
|
-
if (keys.length) {
|
|
231
|
-
let key = keys[0];
|
|
232
|
-
let value = by[key];
|
|
233
|
-
sql += "\nORDER BY " + key + " " + (typeof value === "string" ? value : value ? "ASC" : "DESC");
|
|
234
|
-
for (let i = 1; i < keys.length; i++) {
|
|
235
|
-
key = keys[i];
|
|
236
|
-
value = by[key];
|
|
237
|
-
sql += "," + key + " ";
|
|
238
|
-
if (typeof value === "string")
|
|
239
|
-
sql += value;
|
|
240
|
-
else
|
|
241
|
-
sql += value ? "ASC" : "DESC";
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
return sql;
|
|
246
|
-
}
|
|
247
|
-
function handlerOrderValue(value) {
|
|
248
|
-
if (typeof value === "string")
|
|
249
|
-
return value;
|
|
250
|
-
else {
|
|
251
|
-
let str = value.key + " " + (value.asc ? "ASC" : "DESC");
|
|
252
|
-
if (value.nullLast !== undefined)
|
|
253
|
-
str += value.nullLast ? " NULLS LAST" : " NULLS FIRST";
|
|
254
|
-
return str;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/** @public */
|
|
259
|
-
class SqlStatement {
|
|
260
|
-
}
|
|
261
|
-
/** @public */
|
|
262
|
-
class SqlStatementDataset extends SqlStatement {
|
|
263
|
-
/**
|
|
264
|
-
* 转成子选择语句, 你可以使用 select form xxx 选择
|
|
265
|
-
* 如果是 table 则是 table name
|
|
266
|
-
* 如果是 选择语句,则是 (xxx)
|
|
267
|
-
*/
|
|
268
|
-
toSelect() {
|
|
269
|
-
return "(" + this.toString() + ")";
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
/** @public */
|
|
273
|
-
class SqlTextStatementDataset extends SqlStatementDataset {
|
|
274
|
-
constructor(sql) {
|
|
275
|
-
super();
|
|
276
|
-
this.sql = sql;
|
|
277
|
-
}
|
|
278
|
-
toString() {
|
|
279
|
-
return this.sql;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
var _YourValuesAs_asName, _YourValuesAs_valuesStr, _YourValuesAs_sql;
|
|
284
|
-
/**
|
|
285
|
-
* SQL 原始字符类。可以使用 String 类代替,这只是为了推断类型
|
|
286
|
-
* @public
|
|
287
|
-
*/
|
|
288
|
-
class SqlRaw extends String {
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* SQL value 生成器
|
|
292
|
-
* @public
|
|
293
|
-
*/
|
|
294
|
-
class SqlValuesCreator {
|
|
295
|
-
static create(map) {
|
|
296
|
-
const obj = new this(map);
|
|
297
|
-
const fn = obj.toSqlStr.bind(obj);
|
|
298
|
-
Reflect.setPrototypeOf(fn, obj);
|
|
299
|
-
return fn;
|
|
300
|
-
}
|
|
301
|
-
/**
|
|
302
|
-
* 将字符串转为 SQL 的字符串值的形式(单引号会被转义)。
|
|
303
|
-
* @example 输入 a'b'c , 返回 a''b''c.
|
|
304
|
-
*/
|
|
305
|
-
static string(value) {
|
|
306
|
-
return "'" + value.replaceAll("'", "''") + "'";
|
|
307
|
-
}
|
|
308
|
-
/**
|
|
309
|
-
* @param map - 自定义对象转换
|
|
310
|
-
*/
|
|
311
|
-
constructor(map) {
|
|
312
|
-
this._map = new Map(map);
|
|
313
|
-
}
|
|
314
|
-
setTransformer(type_map, encoder) {
|
|
315
|
-
if (typeof type_map === "function") {
|
|
316
|
-
if (encoder)
|
|
317
|
-
this._map.set(type_map, encoder);
|
|
318
|
-
else
|
|
319
|
-
this._map.delete(type_map);
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
for (const [type, encoder] of type_map) {
|
|
323
|
-
if (typeof type === "function" && typeof encoder === "function") {
|
|
324
|
-
this._map.set(type, encoder);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
/**
|
|
330
|
-
* 将 JS 对象转为 SQL 的字符值的形式 。 undefined 将被转换为 DEFAULT
|
|
331
|
-
* ```ts
|
|
332
|
-
* const v=SqlValuesCreator.create()
|
|
333
|
-
* v() 和 v.toSqlStr() 是等价的
|
|
334
|
-
* ```
|
|
335
|
-
*/
|
|
336
|
-
toSqlStr(value, assertJsType) {
|
|
337
|
-
if (value === null)
|
|
338
|
-
return "NULL";
|
|
339
|
-
else if (value === undefined)
|
|
340
|
-
return "DEFAULT";
|
|
341
|
-
let basicType = typeof value;
|
|
342
|
-
if (assertJsType) {
|
|
343
|
-
if (typeof assertJsType === "function") {
|
|
344
|
-
if (basicType !== "object")
|
|
345
|
-
throw new AssertError("object", basicType);
|
|
346
|
-
let type = this._map.get(assertJsType);
|
|
347
|
-
if (!type) {
|
|
348
|
-
if (assertJsType === Object)
|
|
349
|
-
return this.defaultObject(value);
|
|
350
|
-
throw new Error("类型不存在");
|
|
351
|
-
}
|
|
352
|
-
return type.call(this, value);
|
|
353
|
-
}
|
|
354
|
-
else if (basicType !== assertJsType) {
|
|
355
|
-
throw new AssertError(assertJsType, basicType);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
switch (basicType) {
|
|
359
|
-
case "bigint":
|
|
360
|
-
return value.toString();
|
|
361
|
-
case "number":
|
|
362
|
-
return value.toString();
|
|
363
|
-
case "string":
|
|
364
|
-
return SqlValuesCreator.string(value);
|
|
365
|
-
case "boolean":
|
|
366
|
-
return value.toString();
|
|
367
|
-
case "object": {
|
|
368
|
-
if (value instanceof String)
|
|
369
|
-
return value.toString();
|
|
370
|
-
const Class = this.getClassType(value);
|
|
371
|
-
if (Class)
|
|
372
|
-
return this._map.get(Class).call(this, value);
|
|
373
|
-
return this.defaultObject(value);
|
|
374
|
-
}
|
|
375
|
-
case "undefined":
|
|
376
|
-
return "DEFAULT";
|
|
377
|
-
default:
|
|
378
|
-
//function、symbol
|
|
379
|
-
let type = typeof value;
|
|
380
|
-
throw new Error("不支持 " + type + " 类型");
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* @deprecated 已废弃
|
|
385
|
-
* 获取值对应的 SqlValueEncoder
|
|
386
|
-
*/
|
|
387
|
-
getObjectType(value) {
|
|
388
|
-
for (const Class of this._map.keys()) {
|
|
389
|
-
if (value instanceof Class)
|
|
390
|
-
return this._map.get(Class);
|
|
391
|
-
}
|
|
392
|
-
return this.defaultObject;
|
|
393
|
-
}
|
|
394
|
-
/** 获取值对应已定义的类 */
|
|
395
|
-
getClassType(value) {
|
|
396
|
-
for (const Class of this._map.keys()) {
|
|
397
|
-
if (value instanceof Class)
|
|
398
|
-
return Class;
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
defaultObject(value) {
|
|
402
|
-
return SqlValuesCreator.string(JSON.stringify(value));
|
|
403
|
-
}
|
|
404
|
-
objectListToValuesList(objectList, keys_types, keepUndefinedKey) {
|
|
405
|
-
if (objectList.length <= 0)
|
|
406
|
-
throw new Error("objectList 不能是空数组");
|
|
407
|
-
let keys;
|
|
408
|
-
let asserts;
|
|
409
|
-
if (!keys_types) {
|
|
410
|
-
keys = Array.from(getObjectListKeys(objectList, keepUndefinedKey));
|
|
411
|
-
asserts = [];
|
|
412
|
-
}
|
|
413
|
-
else if (keys_types instanceof Array) {
|
|
414
|
-
keys = keys_types;
|
|
415
|
-
asserts = [];
|
|
416
|
-
}
|
|
417
|
-
else {
|
|
418
|
-
keys = Object.keys(keys_types);
|
|
419
|
-
asserts = initColumnAssert(keys, keys_types);
|
|
420
|
-
}
|
|
421
|
-
let str = "(" + this._internalObjectToValues(objectList[0], keys, asserts) + ")";
|
|
422
|
-
let i = 1;
|
|
423
|
-
let j;
|
|
424
|
-
let value;
|
|
425
|
-
let rows;
|
|
426
|
-
try {
|
|
427
|
-
for (; i < objectList.length; i++) {
|
|
428
|
-
const object = objectList[i];
|
|
429
|
-
rows = [];
|
|
430
|
-
j = 0;
|
|
431
|
-
for (; j < keys.length; j++) {
|
|
432
|
-
value = object[keys[j]];
|
|
433
|
-
rows[j] = this.toSqlStr(value, asserts[j]?.assertJsType);
|
|
434
|
-
}
|
|
435
|
-
str += ",\n(" + rows.join(",") + ")";
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
catch (error) {
|
|
439
|
-
let message = error instanceof Error ? error.message : String(error);
|
|
440
|
-
throw new Error("第 " + i + " 项,字段 '" + keys[j] + "' 异常," + message);
|
|
441
|
-
}
|
|
442
|
-
return str;
|
|
443
|
-
}
|
|
444
|
-
objectToValues(object, keys_types) {
|
|
445
|
-
let type;
|
|
446
|
-
let keys;
|
|
447
|
-
if (keys_types instanceof Array) {
|
|
448
|
-
keys = keys_types;
|
|
449
|
-
type = [];
|
|
450
|
-
}
|
|
451
|
-
else if (keys_types) {
|
|
452
|
-
keys = Object.keys(keys_types);
|
|
453
|
-
type = initColumnAssert(keys, keys_types);
|
|
454
|
-
}
|
|
455
|
-
else {
|
|
456
|
-
keys = Object.keys(object);
|
|
457
|
-
type = [];
|
|
458
|
-
}
|
|
459
|
-
return this._internalObjectToValues(object, keys, type);
|
|
460
|
-
}
|
|
461
|
-
_internalObjectToValues(object, keys, type) {
|
|
462
|
-
const values = [];
|
|
463
|
-
let i = 0;
|
|
464
|
-
let key;
|
|
465
|
-
let value;
|
|
466
|
-
let assertType;
|
|
467
|
-
try {
|
|
468
|
-
for (; i < keys.length; i++) {
|
|
469
|
-
key = keys[i];
|
|
470
|
-
value = object[key];
|
|
471
|
-
assertType = type[i];
|
|
472
|
-
if (assertType) {
|
|
473
|
-
values[i] = this.toSqlStr(value, assertType.assertJsType);
|
|
474
|
-
if (assertType.sqlType)
|
|
475
|
-
values[i] += "::" + assertType.sqlType;
|
|
476
|
-
}
|
|
477
|
-
else
|
|
478
|
-
values[i] = this.toSqlStr(value);
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
catch (error) {
|
|
482
|
-
let message = error instanceof Error ? error.message : String(error);
|
|
483
|
-
throw new Error("字段 '" + key + "' 异常," + message);
|
|
484
|
-
}
|
|
485
|
-
return values.join(",");
|
|
486
|
-
}
|
|
487
|
-
/**
|
|
488
|
-
* 将数组列表转为 SQL 的一个 value
|
|
489
|
-
* @example 返回示例: " 'abc', '6', 'now()' "
|
|
490
|
-
*/
|
|
491
|
-
toValues(values) {
|
|
492
|
-
return values.map((v) => this.toSqlStr(v)).join(",");
|
|
493
|
-
}
|
|
494
|
-
createValues(asName, values, valuesTypes) {
|
|
495
|
-
if (values.length === 0)
|
|
496
|
-
throw new Error("values 不能为空");
|
|
497
|
-
const insertKeys = Object.keys(valuesTypes);
|
|
498
|
-
const defaultValues = [];
|
|
499
|
-
const asserts = new Array(insertKeys.length);
|
|
500
|
-
const valuesStr = new Array(values.length);
|
|
501
|
-
{
|
|
502
|
-
const column0 = new Array(insertKeys.length);
|
|
503
|
-
let columnName;
|
|
504
|
-
let item;
|
|
505
|
-
let sqlType;
|
|
506
|
-
let assertJsType;
|
|
507
|
-
let value;
|
|
508
|
-
for (let i = 0; i < insertKeys.length; i++) {
|
|
509
|
-
columnName = insertKeys[i];
|
|
510
|
-
item = valuesTypes[columnName];
|
|
511
|
-
if (typeof item === "string") {
|
|
512
|
-
sqlType = item;
|
|
513
|
-
defaultValues[i] = "NULL";
|
|
514
|
-
}
|
|
515
|
-
else {
|
|
516
|
-
sqlType = item.sqlType;
|
|
517
|
-
assertJsType = item.assertJsType;
|
|
518
|
-
asserts[i] = assertJsType;
|
|
519
|
-
defaultValues[i] = item.sqlDefault ?? "NULL";
|
|
520
|
-
}
|
|
521
|
-
value = values[0][columnName];
|
|
522
|
-
if (value === undefined)
|
|
523
|
-
column0[i] = defaultValues[i] + "::" + sqlType;
|
|
524
|
-
else
|
|
525
|
-
column0[i] = this.toSqlStr(value, assertJsType) + "::" + sqlType;
|
|
526
|
-
}
|
|
527
|
-
valuesStr[0] = "(" + column0.join(",") + ")";
|
|
528
|
-
}
|
|
529
|
-
let items = new Array(insertKeys.length);
|
|
530
|
-
let value;
|
|
531
|
-
for (let i = 1; i < values.length; i++) {
|
|
532
|
-
for (let j = 0; j < insertKeys.length; j++) {
|
|
533
|
-
value = values[i][insertKeys[j]];
|
|
534
|
-
if (value === undefined)
|
|
535
|
-
items[j] = defaultValues[j];
|
|
536
|
-
else
|
|
537
|
-
items[j] = this.toSqlStr(value, asserts[j]);
|
|
538
|
-
}
|
|
539
|
-
valuesStr[i] = "(" + items.join(",") + ")";
|
|
540
|
-
}
|
|
541
|
-
return new YourValuesAs(insertKeys, asName, valuesStr.join(",\n"));
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
class YourValuesAs extends SqlStatementDataset {
|
|
545
|
-
constructor(columns, asName, valuesStr) {
|
|
546
|
-
super();
|
|
547
|
-
_YourValuesAs_asName.set(this, void 0);
|
|
548
|
-
_YourValuesAs_valuesStr.set(this, void 0);
|
|
549
|
-
_YourValuesAs_sql.set(this, void 0);
|
|
550
|
-
__classPrivateFieldSet(this, _YourValuesAs_asName, asName, "f");
|
|
551
|
-
__classPrivateFieldSet(this, _YourValuesAs_valuesStr, valuesStr, "f");
|
|
552
|
-
__classPrivateFieldSet(this, _YourValuesAs_sql, `(VALUES\n${__classPrivateFieldGet(this, _YourValuesAs_valuesStr, "f")})\nAS ${__classPrivateFieldGet(this, _YourValuesAs_asName, "f")}(${columns.join(",")})`, "f");
|
|
553
|
-
}
|
|
554
|
-
toSelect() {
|
|
555
|
-
return __classPrivateFieldGet(this, _YourValuesAs_sql, "f");
|
|
556
|
-
}
|
|
557
|
-
toString() {
|
|
558
|
-
return __classPrivateFieldGet(this, _YourValuesAs_sql, "f");
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
_YourValuesAs_asName = new WeakMap(), _YourValuesAs_valuesStr = new WeakMap(), _YourValuesAs_sql = new WeakMap();
|
|
562
|
-
function initColumnAssert(keys, keys_types) {
|
|
563
|
-
let key;
|
|
564
|
-
let value;
|
|
565
|
-
let type = new Array(keys.length);
|
|
566
|
-
for (let i = 0; i < keys.length; i++) {
|
|
567
|
-
key = keys[i];
|
|
568
|
-
value = keys_types[key];
|
|
569
|
-
if (typeof value === "string") {
|
|
570
|
-
type[i] = { sqlType: value };
|
|
571
|
-
}
|
|
572
|
-
else {
|
|
573
|
-
type[i] = value;
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
return type;
|
|
577
|
-
}
|
|
578
|
-
class AssertError extends TypeError {
|
|
579
|
-
constructor(assertType, actual) {
|
|
580
|
-
super(`Assert ${assertType} type, Actual ${actual} type`);
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
/** @public PgSql 转换器 */
|
|
585
|
-
const pgSqlTransformer = new Map([
|
|
586
|
-
[
|
|
587
|
-
Array,
|
|
588
|
-
function encodePgArray(value) {
|
|
589
|
-
if (value.length === 0)
|
|
590
|
-
return "NULL";
|
|
591
|
-
const valueStr = [];
|
|
592
|
-
let type;
|
|
593
|
-
let basicType;
|
|
594
|
-
for (let i = 0; i < value.length; i++) {
|
|
595
|
-
if (value[i] === null || value[i] === undefined)
|
|
596
|
-
valueStr[i] = this.toSqlStr(value[i]);
|
|
597
|
-
else if (type) {
|
|
598
|
-
valueStr[i] = this.toSqlStr(value[i], type);
|
|
599
|
-
}
|
|
600
|
-
else {
|
|
601
|
-
basicType = typeof value[i];
|
|
602
|
-
if (basicType === "object") {
|
|
603
|
-
type = this.getClassType(value[i]);
|
|
604
|
-
}
|
|
605
|
-
else
|
|
606
|
-
type = basicType;
|
|
607
|
-
valueStr[i] = this.toSqlStr(value[i], type);
|
|
608
|
-
}
|
|
609
|
-
}
|
|
610
|
-
return "ARRAY[" + valueStr.join(",") + "]";
|
|
611
|
-
},
|
|
612
|
-
],
|
|
613
|
-
[
|
|
614
|
-
Date,
|
|
615
|
-
function (value) {
|
|
616
|
-
return SqlValuesCreator.string(value.toISOString());
|
|
617
|
-
},
|
|
618
|
-
],
|
|
619
|
-
]);
|
|
620
|
-
|
|
621
|
-
var _Selection_instances, _a, _Selection_sql, _Selection_join;
|
|
622
|
-
/**
|
|
623
|
-
* @public ChainSelectWhere 的默认实现
|
|
624
|
-
*/
|
|
625
|
-
class SqlSelectChain extends SqlTextStatementDataset {
|
|
626
|
-
where(param) {
|
|
627
|
-
return new SqlSelectChain(this.toString() + where(param));
|
|
628
|
-
}
|
|
629
|
-
groupBy(columns) {
|
|
630
|
-
let sql = this.toString();
|
|
631
|
-
if (typeof columns === "string")
|
|
632
|
-
sql += " GROUP BY " + columns;
|
|
633
|
-
else
|
|
634
|
-
sql += " GROUP BY " + columns.join(",");
|
|
635
|
-
return new SqlSelectChain(sql);
|
|
636
|
-
}
|
|
637
|
-
having(param) {
|
|
638
|
-
return new SqlSelectChain(this.toString() + having(param));
|
|
639
|
-
}
|
|
640
|
-
orderBy(param) {
|
|
641
|
-
return new SqlSelectChain(this.toString() + orderBy(param));
|
|
642
|
-
}
|
|
643
|
-
limit(limit, offset) {
|
|
644
|
-
let sql = this.toString();
|
|
645
|
-
let type;
|
|
646
|
-
if (limit) {
|
|
647
|
-
type = typeof limit;
|
|
648
|
-
if (type === "number" || type === "bigint")
|
|
649
|
-
sql += "\nLIMIT " + limit;
|
|
650
|
-
else
|
|
651
|
-
throw new TypeError("limit 必须是个整数:" + limit);
|
|
652
|
-
}
|
|
653
|
-
if (offset) {
|
|
654
|
-
type = typeof offset;
|
|
655
|
-
if (type === "number" || type === "bigint")
|
|
656
|
-
sql += "\nOFFSET " + offset;
|
|
657
|
-
else
|
|
658
|
-
throw new TypeError("offset 必须是个整数:" + limit);
|
|
659
|
-
}
|
|
660
|
-
return new SqlTextStatementDataset(sql);
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
function fromAs(selectable, as) {
|
|
664
|
-
if (typeof selectable === "function")
|
|
665
|
-
selectable = selectable();
|
|
666
|
-
let sql = typeof selectable === "string" ? selectable : selectable.toSelect();
|
|
667
|
-
if (as)
|
|
668
|
-
sql += " AS " + as;
|
|
669
|
-
return sql;
|
|
670
|
-
}
|
|
671
|
-
/** @public */
|
|
672
|
-
class Selection {
|
|
673
|
-
static from(selectable, as) {
|
|
674
|
-
return new this(selectable, as);
|
|
675
|
-
}
|
|
676
|
-
constructor(selectable, as) {
|
|
677
|
-
_Selection_instances.add(this);
|
|
678
|
-
_Selection_sql.set(this, void 0);
|
|
679
|
-
__classPrivateFieldSet(this, _Selection_sql, fromAs(selectable, as), "f");
|
|
680
|
-
}
|
|
681
|
-
toString() {
|
|
682
|
-
return "FROM " + __classPrivateFieldGet(this, _Selection_sql, "f");
|
|
683
|
-
}
|
|
684
|
-
fullJoin(selectable, as, on) {
|
|
685
|
-
return __classPrivateFieldGet(this, _Selection_instances, "m", _Selection_join).call(this, "FULL JOIN", selectable, as, on);
|
|
686
|
-
}
|
|
687
|
-
innerJoin(selectable, as, on) {
|
|
688
|
-
return __classPrivateFieldGet(this, _Selection_instances, "m", _Selection_join).call(this, "INNER JOIN", selectable, as, on);
|
|
689
|
-
}
|
|
690
|
-
leftJoin(selectable, as, on) {
|
|
691
|
-
return __classPrivateFieldGet(this, _Selection_instances, "m", _Selection_join).call(this, "LEFT JOIN", selectable, as, on);
|
|
692
|
-
}
|
|
693
|
-
rightJoin(selectable, as, on) {
|
|
694
|
-
return __classPrivateFieldGet(this, _Selection_instances, "m", _Selection_join).call(this, "RIGHT JOIN", selectable, as, on);
|
|
695
|
-
}
|
|
696
|
-
naturalJoin(selectable, as) {
|
|
697
|
-
return __classPrivateFieldGet(this, _Selection_instances, "m", _Selection_join).call(this, "NATURAL JOIN", selectable, as);
|
|
698
|
-
}
|
|
699
|
-
crossJoin(selectable, as) {
|
|
700
|
-
return __classPrivateFieldGet(this, _Selection_instances, "m", _Selection_join).call(this, "CROSS JOIN", selectable, as);
|
|
701
|
-
}
|
|
702
|
-
from(selectable, as) {
|
|
703
|
-
return new _a(__classPrivateFieldGet(this, _Selection_sql, "f") + "," + fromAs(selectable, as));
|
|
704
|
-
}
|
|
705
|
-
select(columnsIn) {
|
|
706
|
-
if (typeof columnsIn === "function")
|
|
707
|
-
columnsIn = columnsIn();
|
|
708
|
-
let sql = "SELECT " + selectColumns(columnsIn);
|
|
709
|
-
sql += "\n" + this.toString();
|
|
710
|
-
return new SqlSelectChain(sql);
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
_a = Selection, _Selection_sql = new WeakMap(), _Selection_instances = new WeakSet(), _Selection_join = function _Selection_join(type, selectable, as, on) {
|
|
714
|
-
let sql = __classPrivateFieldGet(this, _Selection_sql, "f") + "\n" + type + " " + fromAs(selectable, as);
|
|
715
|
-
if (on) {
|
|
716
|
-
sql += " ON " + condition(on);
|
|
717
|
-
}
|
|
718
|
-
return new _a(sql);
|
|
719
|
-
};
|
|
720
|
-
|
|
721
|
-
class SqlChainModify extends SqlStatement {
|
|
722
|
-
constructor(sql) {
|
|
723
|
-
super();
|
|
724
|
-
this.sql = sql;
|
|
725
|
-
}
|
|
726
|
-
returning(returns) {
|
|
727
|
-
if (typeof returns === "function")
|
|
728
|
-
returns = returns();
|
|
729
|
-
let columnsStr;
|
|
730
|
-
if (returns === "*") {
|
|
731
|
-
columnsStr = "*";
|
|
732
|
-
}
|
|
733
|
-
else {
|
|
734
|
-
columnsStr = selectColumns(returns);
|
|
735
|
-
}
|
|
736
|
-
let sql = this.toString() + "\nRETURNING " + columnsStr;
|
|
737
|
-
return new SqlTextStatementDataset(sql);
|
|
738
|
-
}
|
|
739
|
-
onConflict(onConflict) {
|
|
740
|
-
if (typeof onConflict === "function")
|
|
741
|
-
onConflict = onConflict();
|
|
742
|
-
if (typeof onConflict !== "string")
|
|
743
|
-
onConflict = onConflict.join(",");
|
|
744
|
-
let sql = this.toString() + `\nON CONFLICT (${onConflict})`;
|
|
745
|
-
return new SqlInsertConflictBranch(sql);
|
|
746
|
-
}
|
|
747
|
-
where(where$1) {
|
|
748
|
-
const sql = where(where$1);
|
|
749
|
-
return new SqlChainModify(this.toString() + sql);
|
|
750
|
-
}
|
|
751
|
-
toString() {
|
|
752
|
-
return this.sql;
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
class SqlInsertConflictBranch {
|
|
756
|
-
constructor(sql) {
|
|
757
|
-
this.sql = sql;
|
|
758
|
-
}
|
|
759
|
-
doUpdate(set) {
|
|
760
|
-
if (typeof set === "function")
|
|
761
|
-
set = set();
|
|
762
|
-
let sql = this.sql;
|
|
763
|
-
if (typeof set === "object") {
|
|
764
|
-
sql += "\nDO UPDATE ";
|
|
765
|
-
sql += createUpdateSetFromObject(set);
|
|
766
|
-
}
|
|
767
|
-
else if (set)
|
|
768
|
-
sql += "DO UPDATE SET\n" + set;
|
|
769
|
-
else
|
|
770
|
-
sql += "DO NOTHING";
|
|
771
|
-
return new SqlChainModify(sql);
|
|
772
|
-
}
|
|
773
|
-
doNotThing() {
|
|
774
|
-
return new SqlChainModify(this.sql + " DO NOTHING");
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
|
|
778
|
-
/**
|
|
779
|
-
* 数据库表
|
|
780
|
-
* @public
|
|
781
|
-
*/
|
|
782
|
-
class DbTable {
|
|
783
|
-
constructor(name) {
|
|
784
|
-
this.name = name;
|
|
785
|
-
}
|
|
786
|
-
fromAs(as) {
|
|
787
|
-
return new Selection(this.name, as);
|
|
788
|
-
}
|
|
789
|
-
select(columns, as) {
|
|
790
|
-
return this.fromAs(as).select(columns);
|
|
791
|
-
}
|
|
792
|
-
/**
|
|
793
|
-
* INSERT 语句,需要注意 SQL 注入
|
|
794
|
-
* @example
|
|
795
|
-
* ```ts
|
|
796
|
-
* table.insert(["age","name"], "VALUES (18, 'hi'), (17, 'hh')") // INSERT INTO table(age,name) VALUES(18, 'hi'), (17, 'hh')
|
|
797
|
-
* ```
|
|
798
|
-
*/
|
|
799
|
-
insert(columns, values) {
|
|
800
|
-
if (typeof columns !== "string" || !columns)
|
|
801
|
-
throw new TypeError("columns 必须是有效的 string 类型");
|
|
802
|
-
if (typeof values === "function")
|
|
803
|
-
values = values();
|
|
804
|
-
if (typeof values !== "string")
|
|
805
|
-
throw new TypeError("values 必须是 string 或 function 类型");
|
|
806
|
-
let sql = `INSERT INTO ${this.name}(${columns})\n${values}`;
|
|
807
|
-
return new SqlChainModify(sql);
|
|
808
|
-
}
|
|
809
|
-
/**
|
|
810
|
-
* UPDATE 语句,需要注意 SQL 注入
|
|
811
|
-
* @example
|
|
812
|
-
* ```ts
|
|
813
|
-
* table.update("age=3, name='hi'") // "UPDATE table SET age=3, name='hi'"
|
|
814
|
-
* table.update({age: "3", name: "'hi'", k1: undefined, k2: ""}) // "UPDATE table SET age=3, name='hi'"
|
|
815
|
-
* ```
|
|
816
|
-
*/
|
|
817
|
-
update(values) {
|
|
818
|
-
if (typeof values === "function")
|
|
819
|
-
values = values();
|
|
820
|
-
switch (typeof values) {
|
|
821
|
-
case "object": {
|
|
822
|
-
let sql = createUpdateSetFromObject(values);
|
|
823
|
-
return new SqlChainModify("UPDATE " + this.name + " " + sql);
|
|
824
|
-
}
|
|
825
|
-
case "string":
|
|
826
|
-
return new SqlChainModify("UPDATE " + this.name + " SET\n" + values);
|
|
827
|
-
default:
|
|
828
|
-
throw new TypeError("参数 values 错误");
|
|
829
|
-
}
|
|
830
|
-
}
|
|
831
|
-
delete(option = {}) {
|
|
832
|
-
let sql = "DELETE FROM " + this.name;
|
|
833
|
-
sql += where(option.where);
|
|
834
|
-
return new SqlChainModify(sql);
|
|
835
|
-
}
|
|
836
|
-
toSelect() {
|
|
837
|
-
return this.name;
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
|
|
841
|
-
/** @public */
|
|
842
|
-
class DbTableQuery extends DbTable {
|
|
843
|
-
constructor(name, statement) {
|
|
844
|
-
super(name);
|
|
845
|
-
this.statement = statement;
|
|
846
|
-
}
|
|
847
|
-
insert(values_column, _values) {
|
|
848
|
-
if (_values)
|
|
849
|
-
return super.insert(values_column, _values);
|
|
850
|
-
let values = values_column;
|
|
851
|
-
if (typeof values === "function")
|
|
852
|
-
values = values();
|
|
853
|
-
if (typeof values !== "object")
|
|
854
|
-
throw new TypeError("values 类型错误");
|
|
855
|
-
let valuesStr;
|
|
856
|
-
let insertCol;
|
|
857
|
-
if (values instanceof Array) {
|
|
858
|
-
if (values.length === 0)
|
|
859
|
-
throw new Error("值不能为空");
|
|
860
|
-
insertCol = Array.from(getObjectListKeys(values));
|
|
861
|
-
valuesStr = `VALUES\n${this.statement.objectListToValuesList(values, insertCol)}`;
|
|
862
|
-
}
|
|
863
|
-
else {
|
|
864
|
-
insertCol = Object.keys(values);
|
|
865
|
-
valuesStr = `VALUES\n(${this.statement.objectToValues(values, insertCol)})`;
|
|
866
|
-
}
|
|
867
|
-
if (insertCol.length === 0)
|
|
868
|
-
throw new Error("插入列不能为空");
|
|
869
|
-
const columnStr = insertCol.join(",");
|
|
870
|
-
let sql = `INSERT INTO ${this.name} (${columnStr})\n${valuesStr}`;
|
|
871
|
-
return new SqlChainModify(sql);
|
|
872
|
-
}
|
|
873
|
-
/**
|
|
874
|
-
* UPDATE 语句,与 update() 不同的是,它会将值进行安全转换
|
|
875
|
-
* @example
|
|
876
|
-
* ```ts
|
|
877
|
-
* table.update({age:3, name:"hi"}, true) // "UPDATE table SET age=3, name='hi'"
|
|
878
|
-
* ```
|
|
879
|
-
*/
|
|
880
|
-
updateFrom(values) {
|
|
881
|
-
if (typeof values === "function")
|
|
882
|
-
values = values();
|
|
883
|
-
let setStr;
|
|
884
|
-
if (typeof values === "string")
|
|
885
|
-
setStr = values;
|
|
886
|
-
else {
|
|
887
|
-
const updateKey = Object.entries(values);
|
|
888
|
-
let setList = [];
|
|
889
|
-
for (const [k, v] of updateKey) {
|
|
890
|
-
if (v === undefined)
|
|
891
|
-
continue;
|
|
892
|
-
setList.push(k + "= " + this.statement.toSqlStr(v));
|
|
893
|
-
}
|
|
894
|
-
setStr = setList.join(",\n");
|
|
895
|
-
}
|
|
896
|
-
if (!setStr)
|
|
897
|
-
throw new Error("值不能为空");
|
|
898
|
-
let sql = `UPDATE ${this.name} SET\n${setStr}`;
|
|
899
|
-
return new SqlChainModify(sql);
|
|
900
|
-
}
|
|
901
|
-
}
|
|
902
|
-
|
|
903
|
-
/**
|
|
904
|
-
* 表格列的信息
|
|
905
|
-
* @public
|
|
906
|
-
*/
|
|
907
|
-
class ColumnMeta {
|
|
908
|
-
constructor(type,
|
|
909
|
-
/** 数据库原始数据类型 */
|
|
910
|
-
sqlType,
|
|
911
|
-
/** 是否非空 */
|
|
912
|
-
notNull = false,
|
|
913
|
-
/** 是否是数组类型 */
|
|
914
|
-
isArray = false,
|
|
915
|
-
/** 数据库原始默认值 */
|
|
916
|
-
sqlDefault) {
|
|
917
|
-
this.type = type;
|
|
918
|
-
this.sqlType = sqlType;
|
|
919
|
-
this.notNull = notNull;
|
|
920
|
-
this.isArray = isArray;
|
|
921
|
-
this.sqlDefault = sqlDefault;
|
|
922
|
-
}
|
|
923
|
-
/** 校验 value 的类型 */
|
|
924
|
-
checkValue(value) {
|
|
925
|
-
if (typeof this.type === "function")
|
|
926
|
-
return value instanceof this.type;
|
|
927
|
-
return this.type.is(value);
|
|
928
|
-
}
|
|
929
|
-
}
|
|
930
|
-
/**
|
|
931
|
-
* 数据库类型到JS类型的映射
|
|
932
|
-
* @public
|
|
933
|
-
*/
|
|
934
|
-
class YourTypeMap {
|
|
935
|
-
static create(rawTypeMap) {
|
|
936
|
-
return new this(rawTypeMap);
|
|
937
|
-
}
|
|
938
|
-
constructor(typeMap = {}) {
|
|
939
|
-
this.typeMap = typeMap;
|
|
940
|
-
}
|
|
941
|
-
genColumn(type, notNull, defaultValue) {
|
|
942
|
-
const constructor = Reflect.get(this.typeMap, type);
|
|
943
|
-
const column = new ColumnMeta(constructor, type, notNull, false, defaultValue);
|
|
944
|
-
return column;
|
|
945
|
-
}
|
|
946
|
-
genArrColumn(type, notNull, defaultValue) {
|
|
947
|
-
const constructor = Reflect.get(this.typeMap, type);
|
|
948
|
-
const column = new ColumnMeta(constructor, type + "[]", notNull, true, defaultValue);
|
|
949
|
-
return column;
|
|
950
|
-
}
|
|
951
|
-
}
|
|
952
|
-
function baseType(v) {
|
|
953
|
-
return typeof v === this.name;
|
|
954
|
-
}
|
|
955
|
-
/**
|
|
956
|
-
* 自定义数据类型
|
|
957
|
-
* @public
|
|
958
|
-
*/
|
|
959
|
-
class CustomDbType {
|
|
960
|
-
constructor(is, name) {
|
|
961
|
-
this.is = is;
|
|
962
|
-
this.name = name;
|
|
963
|
-
}
|
|
964
|
-
}
|
|
965
|
-
CustomDbType.bigint = new CustomDbType(baseType, "bigint");
|
|
966
|
-
CustomDbType.number = new CustomDbType(baseType, "number");
|
|
967
|
-
CustomDbType.string = new CustomDbType(baseType, "string");
|
|
968
|
-
CustomDbType.boolean = new CustomDbType(baseType, "boolean");
|
|
969
|
-
|
|
970
|
-
/** @public */
|
|
971
|
-
class TypeChecker {
|
|
972
|
-
constructor(map) {
|
|
973
|
-
this.map = map;
|
|
974
|
-
}
|
|
975
|
-
check(value) {
|
|
976
|
-
const map = this.map;
|
|
977
|
-
let v;
|
|
978
|
-
for (const [k, expect] of map) {
|
|
979
|
-
v = value[k];
|
|
980
|
-
let err;
|
|
981
|
-
if (v === null) {
|
|
982
|
-
if (expect.notNull)
|
|
983
|
-
throw new Error(`${k} 不能为空`);
|
|
984
|
-
continue;
|
|
985
|
-
}
|
|
986
|
-
else if (v === undefined) {
|
|
987
|
-
if (expect.sqlDefault === undefined && expect.notNull)
|
|
988
|
-
throw new Error(`${k} 不能为 undefined`);
|
|
989
|
-
continue;
|
|
990
|
-
}
|
|
991
|
-
else if (expect.isArray) {
|
|
992
|
-
if (v instanceof Array)
|
|
993
|
-
err = this.checkArray(v, expect.type);
|
|
994
|
-
else
|
|
995
|
-
err = getErrStr(`Array<${expect.type.name}>`, typeof v);
|
|
996
|
-
}
|
|
997
|
-
else {
|
|
998
|
-
err = this.checkItem(v, expect.type);
|
|
999
|
-
}
|
|
1000
|
-
if (err)
|
|
1001
|
-
throw new Error(`Key ${k} error: ${err}`);
|
|
1002
|
-
}
|
|
1003
|
-
return value;
|
|
1004
|
-
}
|
|
1005
|
-
checkList(value) {
|
|
1006
|
-
let i = 0;
|
|
1007
|
-
try {
|
|
1008
|
-
for (let i = 0; i < value.length; i++) {
|
|
1009
|
-
this.check(value[i]);
|
|
1010
|
-
}
|
|
1011
|
-
return value;
|
|
1012
|
-
}
|
|
1013
|
-
catch (error) {
|
|
1014
|
-
throw new Error(`Item ${i}, ${error.message}`);
|
|
1015
|
-
}
|
|
1016
|
-
}
|
|
1017
|
-
checkArray(v, expect) {
|
|
1018
|
-
let err;
|
|
1019
|
-
for (let i = 0; i < v.length; i++) {
|
|
1020
|
-
err = this.checkItem(v[i], expect);
|
|
1021
|
-
if (err)
|
|
1022
|
-
return `Item[${i}] ${err}`;
|
|
1023
|
-
}
|
|
1024
|
-
}
|
|
1025
|
-
checkItem(v, expect) {
|
|
1026
|
-
if (expect instanceof CustomDbType) {
|
|
1027
|
-
if (expect.is(v))
|
|
1028
|
-
return;
|
|
1029
|
-
}
|
|
1030
|
-
else {
|
|
1031
|
-
if (v instanceof expect)
|
|
1032
|
-
return;
|
|
1033
|
-
}
|
|
1034
|
-
let actName = typeof v;
|
|
1035
|
-
if (actName === "object") {
|
|
1036
|
-
if (v === null)
|
|
1037
|
-
actName = "null";
|
|
1038
|
-
else
|
|
1039
|
-
actName = v.constructor?.name ?? "object";
|
|
1040
|
-
}
|
|
1041
|
-
return getErrStr(expect.name, typeof v);
|
|
1042
|
-
}
|
|
1043
|
-
}
|
|
1044
|
-
function getErrStr(expect, actual) {
|
|
1045
|
-
return `Expect ${expect}, Actual ${actual}`;
|
|
1046
|
-
}
|
|
1047
|
-
|
|
1048
|
-
/**
|
|
1049
|
-
* 完整数据库表数据
|
|
1050
|
-
* @public
|
|
1051
|
-
*/
|
|
1052
|
-
class YourTable extends DbTableQuery {
|
|
1053
|
-
constructor(name, define, sqlValue) {
|
|
1054
|
-
super(name, sqlValue);
|
|
1055
|
-
this.define = define;
|
|
1056
|
-
this.columns = Object.keys(define);
|
|
1057
|
-
}
|
|
1058
|
-
getColumnMeta(name) {
|
|
1059
|
-
return Reflect.get(this.define, name);
|
|
1060
|
-
}
|
|
1061
|
-
createTypeChecker(keys) {
|
|
1062
|
-
let map = new Map();
|
|
1063
|
-
let defined = this.define;
|
|
1064
|
-
let k;
|
|
1065
|
-
for (let i = 0; i < keys.length; i++) {
|
|
1066
|
-
k = keys[i];
|
|
1067
|
-
if (defined[k] === undefined)
|
|
1068
|
-
throw new Error(`key ${k} 未定义`);
|
|
1069
|
-
map.set(k, defined[k]);
|
|
1070
|
-
}
|
|
1071
|
-
return new TypeChecker(map);
|
|
1072
|
-
}
|
|
1073
|
-
}
|
|
1074
|
-
|
|
1075
|
-
/**
|
|
1076
|
-
* 默认的 SqlValuesCreator 实列
|
|
1077
|
-
* @public
|
|
1078
|
-
*/
|
|
1079
|
-
const v = SqlValuesCreator.create(pgSqlTransformer);
|
|
1080
|
-
|
|
1081
|
-
export { ColumnMeta, CustomDbType, DbTable, DbTableQuery, Selection, SqlRaw, SqlSelectChain, SqlStatement, SqlStatementDataset, SqlTextStatementDataset, SqlValuesCreator, TypeChecker, YourTable, YourTypeMap, getObjectListKeys, having, orderBy, pgSqlTransformer, selectColumns, v, where };
|