@asla/yoursql 0.8.7 → 0.8.9
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.md +138 -10
- package/dist/client/DbPoolConnection.d.ts +5 -9
- package/dist/client/DbPoolConnection.js +3 -2
- package/dist/client/DbPoolTransaction.d.ts +4 -8
- package/dist/client/DbQuery.d.ts +17 -44
- package/dist/client/DbQuery.js +7 -0
- package/dist/client/DbQueryBase.d.ts +26 -0
- package/dist/client/interfaces.d.ts +5 -3
- package/dist/client/mod.d.ts +1 -0
- package/dist/sql_gen/mod.js +0 -1
- package/dist/sql_gen/select/DbTable.d.ts +2 -0
- package/dist/sql_gen/select/type.d.ts +1 -2
- package/dist/sql_gen/sql_value/sql_value.d.ts +5 -11
- package/dist/sql_gen/sql_value/sql_value.js +10 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -18,17 +18,16 @@ SQL 生成器
|
|
|
18
18
|
|
|
19
19
|
[API 文档](https://jsr.io/@asla/yoursql/doc)
|
|
20
20
|
|
|
21
|
-
###
|
|
21
|
+
### v()
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
安全转将 JS 值转换为 SQL 值,避免 SQL 注入
|
|
24
|
+
|
|
25
|
+
`v` 函数能够将 JS 值转换为 SQL 的文本形式。\
|
|
26
|
+
默认情况下,支持 PostgresSQL, 因为不同数据库的值转换有些差异,如果使用其他数据库,可能需要配置对象到字符串的自定义转换器
|
|
24
27
|
|
|
25
28
|
```ts
|
|
26
29
|
import { v } from "@asla/yoursql";
|
|
27
|
-
```
|
|
28
30
|
|
|
29
|
-
默认情况下,支持 PostgresSQL, 因为不同数据库的值转换有些差异,如果使用其他数据库,可能需要配置对象转换器
|
|
30
|
-
|
|
31
|
-
```ts
|
|
32
31
|
v(1); // "1"
|
|
33
32
|
v(1n); // "1"
|
|
34
33
|
v("te'xt"); // "'te''xt'"
|
|
@@ -37,32 +36,86 @@ v([1, 2, 3]); // "ARRAY[1,2,3]"
|
|
|
37
36
|
v({ id: "abc", size: 1 }); // "'{\"id\":\"abc\",\"size\":1}'"
|
|
38
37
|
v(null); // "NULL"
|
|
39
38
|
v(undefined); // "DEFAULT"
|
|
39
|
+
|
|
40
|
+
const params = { id: 3 };
|
|
41
|
+
const sql = `SELECT * FROM user WHERE user_id=${v(params.id)}`;
|
|
40
42
|
```
|
|
41
43
|
|
|
42
|
-
如果传入 String
|
|
44
|
+
如果传入 String 对象,将保留其字符串值,不会进行任何转换, 这在有些需要原生SQL操作的场景下非常有用
|
|
43
45
|
|
|
44
46
|
```ts
|
|
47
|
+
import { v } from "@asla/yoursql";
|
|
48
|
+
|
|
45
49
|
v(new String("1+1")); // "1+1"
|
|
46
50
|
```
|
|
47
51
|
|
|
48
52
|
你可以自定义对象到字符串的转换, 例如,你想将 Set 转换为 PostgresSql 的 ARRAY[] 输入格式
|
|
49
53
|
|
|
50
54
|
```ts
|
|
55
|
+
import { v } from "@asla/yoursql";
|
|
56
|
+
|
|
51
57
|
v.setTransformer(Set, function (value: Set) {
|
|
52
58
|
return this.v(Array.from(value));
|
|
53
59
|
});
|
|
60
|
+
|
|
61
|
+
v(new Set([1, 2, 3])); // "ARRAY[1,2,3]"
|
|
54
62
|
```
|
|
55
63
|
|
|
56
|
-
|
|
64
|
+
#### v.toValues()
|
|
65
|
+
|
|
66
|
+
转换数组为 values 的单个值
|
|
57
67
|
|
|
58
68
|
```ts
|
|
69
|
+
import { v } from "@asla/yoursql";
|
|
70
|
+
v.toValues([1, "abc", null, undefined, { key: "value" }]); // `1,'abc',NULL,DEFAULT,'{"key":"value"}'`
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
#### v.objectToValues()
|
|
74
|
+
|
|
75
|
+
转换对象为 values 的单个值
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
import { v } from "@asla/yoursql";
|
|
79
|
+
const obj = { a: "a1", b: "b1", c: undefined, d: "d1" };
|
|
80
|
+
v.objectToValues(obj); // "'a1','b1',DEFAULT,'d1'"
|
|
81
|
+
v.objectToValues(obj, ["b", "a"]); // "'b1','a1'"
|
|
82
|
+
v.objectToValues(obj, [{ a: "TEXT", b: {} }]); // 'a1'::TEXT,'b1'"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
#### v.objectListToValuesList()
|
|
86
|
+
|
|
87
|
+
转换对象数组为 values
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
import { v } from "@asla/yoursql";
|
|
91
|
+
|
|
59
92
|
const values = [{ a: 1, b: 2 }, { c: 3 }];
|
|
60
93
|
|
|
61
94
|
// 这将自动选择数组中所有键的并集
|
|
62
95
|
v.objectListToValuesList(values); // "(1,2,null),(null,null,3)"
|
|
63
96
|
|
|
64
97
|
// 或者你可以指定选择键并指定顺序
|
|
65
|
-
v.objectListToValuesList(values, ["c", "b"]); // "(null,2),(3,3)"
|
|
98
|
+
const valueStr = v.objectListToValuesList(values, ["c", "b"]); // "(null,2),(3,3)"
|
|
99
|
+
|
|
100
|
+
const sql = `INSERT INTO user(name, role) VALUES ${valueStr}`;
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
#### v.createValues()
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
const objectList = [{ age: 1, name: "hhh" }, { age: 2, name: "row2" }, { age: 3, name: "row3" }, {}];
|
|
107
|
+
|
|
108
|
+
v.createValues("customName", objectList, {
|
|
109
|
+
age: { sqlType: "INT", sqlDefault: "MAXIMUM(1,2)" },
|
|
110
|
+
name: "TEXT",
|
|
111
|
+
});
|
|
112
|
+
//这将返回
|
|
113
|
+
`(VALUES
|
|
114
|
+
(1::INT,'hhh'::TEXT),
|
|
115
|
+
(2,'row2'),
|
|
116
|
+
(3,'row3'),
|
|
117
|
+
(MAXIMUM(1,2),NULL))
|
|
118
|
+
AS customName(age,name)`;
|
|
66
119
|
```
|
|
67
120
|
|
|
68
121
|
### 生成 SQL 语句
|
|
@@ -78,6 +131,17 @@ const s = Selection.from("user", "u")
|
|
|
78
131
|
.toString();
|
|
79
132
|
```
|
|
80
133
|
|
|
134
|
+
查看 [select](./docs/select.md) 用法
|
|
135
|
+
查看 [insert/update/delete](./docs/table.md) 用法
|
|
136
|
+
|
|
137
|
+
#### Constructable
|
|
138
|
+
|
|
139
|
+
toto
|
|
140
|
+
|
|
141
|
+
#### ConditionParam
|
|
142
|
+
|
|
143
|
+
toto
|
|
144
|
+
|
|
81
145
|
### client 抽象类
|
|
82
146
|
|
|
83
147
|
yoursql 还导出了一些抽象类,实现抽象类后可以方便的进行数据查询
|
|
@@ -98,7 +162,12 @@ import {
|
|
|
98
162
|
|
|
99
163
|
```ts
|
|
100
164
|
class YourQuery extends DbQuery {
|
|
101
|
-
|
|
165
|
+
query<T = any>(sql: StringLike): Promise<QueryRowsResult<T>> {
|
|
166
|
+
// implement
|
|
167
|
+
}
|
|
168
|
+
multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: StringLike): Promise<T> {
|
|
169
|
+
// implement
|
|
170
|
+
}
|
|
102
171
|
}
|
|
103
172
|
const db: DbQuery = new YourQuery();
|
|
104
173
|
```
|
|
@@ -190,3 +259,62 @@ for await (const element of cursor) {
|
|
|
190
259
|
if (conditions) break; //提前关闭游标
|
|
191
260
|
}
|
|
192
261
|
```
|
|
262
|
+
|
|
263
|
+
### 扩展查询链
|
|
264
|
+
|
|
265
|
+
```ts
|
|
266
|
+
import { v, SqlStatement, SqlStatementDataset, SqlValuesCreator } from "@asla/yoursql";
|
|
267
|
+
import type { DbCursor, QueryResult, QueryRowsResult } from "@asla/yoursql/client";
|
|
268
|
+
|
|
269
|
+
declare const pool: DbQueryPool = new YourPool(); // 你需要实现一个 DbQueryPool
|
|
270
|
+
|
|
271
|
+
export interface QueryableSql {
|
|
272
|
+
query(): Promise<QueryResult>;
|
|
273
|
+
queryCount(): Promise<number>;
|
|
274
|
+
}
|
|
275
|
+
export interface QueryableDataSql<T> extends QueryableSql {
|
|
276
|
+
queryRows(): Promise<T[]>;
|
|
277
|
+
queryMap<K>(key: string): Promise<Map<K, T>>;
|
|
278
|
+
cursor(): Promise<DbCursor<T>>;
|
|
279
|
+
}
|
|
280
|
+
declare module "@asla/yoursql" {
|
|
281
|
+
interface SqlStatement extends QueryableSql {}
|
|
282
|
+
interface SqlStatementDataset<T> extends QueryableDataSql<T> {}
|
|
283
|
+
}
|
|
284
|
+
const base: QueryableSql = {
|
|
285
|
+
queryCount(): Promise<number> {
|
|
286
|
+
return dbPool.queryCount(this.toString());
|
|
287
|
+
},
|
|
288
|
+
query(): Promise<QueryRowsResult<any>> {
|
|
289
|
+
return dbPool.query<any>(this);
|
|
290
|
+
},
|
|
291
|
+
};
|
|
292
|
+
const obj: QueryableDataSql<any> = {
|
|
293
|
+
...base,
|
|
294
|
+
cursor(): Promise<DbCursor<any>> {
|
|
295
|
+
return dbPool.cursor(this.toString());
|
|
296
|
+
},
|
|
297
|
+
queryMap<K>(key: string): Promise<Map<K, any>> {
|
|
298
|
+
return dbPool.queryMap(this.toString(), key);
|
|
299
|
+
},
|
|
300
|
+
queryRows(): Promise<any[]> {
|
|
301
|
+
return dbPool.queryRows(this.toString());
|
|
302
|
+
},
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
Object.assign(SqlStatement.prototype, base);
|
|
306
|
+
Object.assign(SqlStatementDataset.prototype, obj);
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
现在,以及扩展了 SqlStatement 和 SqlStatementDataset 类的原型链,你可以从 select 等语句直接调用查询方法了
|
|
310
|
+
|
|
311
|
+
```ts
|
|
312
|
+
import { Selection, v } from "@asla/yoursql";
|
|
313
|
+
|
|
314
|
+
const searchName = "Bob";
|
|
315
|
+
const rows = await Selection.from("user", "u")
|
|
316
|
+
.innerJoin("role", "r", "u.id=r.user_id")
|
|
317
|
+
.select({ uid: "u.id", rid: "r.id", example: "u.id||r.id" })
|
|
318
|
+
.where(`u.name LIKE %${v(searchName)}%`)
|
|
319
|
+
.queryRows();
|
|
320
|
+
```
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { SqlStatementDataset } from "../sql_gen/mod.ts";
|
|
2
2
|
import { DbQuery } from "./DbQuery.ts";
|
|
3
|
-
import type { MultipleQueryResult, QueryRowsResult } from "./
|
|
4
|
-
import type {
|
|
3
|
+
import type { MultipleQueryResult, QueryRowsResult, DbQueryBase } from "./DbQueryBase.ts";
|
|
4
|
+
import type { StringLike, TransactionMode } from "./interfaces.ts";
|
|
5
5
|
/**
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -10,15 +10,11 @@ import type { DbConnection, TransactionMode } from "./interfaces.ts";
|
|
|
10
10
|
*/
|
|
11
11
|
export declare class DbPoolConnection extends DbQuery {
|
|
12
12
|
#private;
|
|
13
|
-
constructor(conn:
|
|
13
|
+
constructor(conn: DbQueryBase, onRelease: (conn: DbQueryBase) => void);
|
|
14
14
|
begin(mode?: TransactionMode): Promise<void>;
|
|
15
15
|
query<T = any>(sql: SqlStatementDataset<T>): Promise<QueryRowsResult<T>>;
|
|
16
|
-
query<T = any>(sql:
|
|
17
|
-
|
|
18
|
-
}): Promise<QueryRowsResult<T>>;
|
|
19
|
-
multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: {
|
|
20
|
-
toString(): string;
|
|
21
|
-
}): Promise<T>;
|
|
16
|
+
query<T = any>(sql: StringLike): Promise<QueryRowsResult<T>>;
|
|
17
|
+
multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: StringLike): Promise<T>;
|
|
22
18
|
rollback(): Promise<void>;
|
|
23
19
|
commit(): Promise<void>;
|
|
24
20
|
get released(): boolean;
|
|
@@ -42,9 +42,10 @@ class DbPoolConnection extends DbQuery {
|
|
|
42
42
|
}
|
|
43
43
|
/** 调用 release() 时,如果事务未提交,则抛出异常 */
|
|
44
44
|
release() {
|
|
45
|
-
|
|
45
|
+
const conn = this.#conn;
|
|
46
|
+
if (conn) {
|
|
46
47
|
this.#conn = undefined;
|
|
47
|
-
this.#onRelease();
|
|
48
|
+
this.#onRelease(conn);
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
51
|
//implement
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { SqlStatementDataset } from "../sql_gen/mod.ts";
|
|
2
2
|
import { DbQuery } from "./DbQuery.ts";
|
|
3
|
-
import type { MultipleQueryResult, QueryRowsResult } from "./
|
|
3
|
+
import type { MultipleQueryResult, QueryRowsResult } from "./DbQueryBase.ts";
|
|
4
4
|
import type { DbPoolConnection } from "./DbPoolConnection.ts";
|
|
5
|
-
import type { DbTransaction, TransactionMode } from "./interfaces.ts";
|
|
5
|
+
import type { DbTransaction, StringLike, TransactionMode } from "./interfaces.ts";
|
|
6
6
|
/** @public */
|
|
7
7
|
export type DbPoolTransactionOption = {
|
|
8
8
|
errorRollback?: boolean;
|
|
@@ -21,13 +21,9 @@ export declare class DbPoolTransaction extends DbQuery implements DbTransaction
|
|
|
21
21
|
savePoint(savePoint: string): Promise<void>;
|
|
22
22
|
rollbackTo(savePoint: string): Promise<void>;
|
|
23
23
|
query<T extends object = any>(sql: SqlStatementDataset<T>): Promise<QueryRowsResult<T>>;
|
|
24
|
-
query<T extends object = any>(sql:
|
|
25
|
-
toString(): string;
|
|
26
|
-
}): Promise<QueryRowsResult<T>>;
|
|
24
|
+
query<T extends object = any>(sql: StringLike): Promise<QueryRowsResult<T>>;
|
|
27
25
|
multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: SqlStatementDataset<T>): Promise<T>;
|
|
28
|
-
multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql:
|
|
29
|
-
toString(): string;
|
|
30
|
-
}): Promise<T>;
|
|
26
|
+
multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: StringLike): Promise<T>;
|
|
31
27
|
get released(): boolean;
|
|
32
28
|
[Symbol.asyncDispose](): Promise<void>;
|
|
33
29
|
}
|
package/dist/client/DbQuery.d.ts
CHANGED
|
@@ -1,45 +1,22 @@
|
|
|
1
1
|
import type { SqlStatementDataset } from "../sql_gen/mod.ts";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
rowCount: number;
|
|
5
|
-
rows?: any[];
|
|
6
|
-
}
|
|
7
|
-
/** @public */
|
|
8
|
-
export interface QueryRowsResult<T = any> extends SingleQueryResult {
|
|
9
|
-
rowCount: number;
|
|
10
|
-
rows: T[];
|
|
11
|
-
}
|
|
12
|
-
/** @public */
|
|
13
|
-
export type MultipleQueryResult = SingleQueryResult[];
|
|
14
|
-
/** @public */
|
|
15
|
-
export type QueryResult = MultipleQueryResult | SingleQueryResult;
|
|
2
|
+
import { StringLike } from "./interfaces.ts";
|
|
3
|
+
import { MultipleQueryResult, DbQueryBase, QueryRowsResult } from "./DbQueryBase.ts";
|
|
16
4
|
/**
|
|
17
5
|
* SQL 查询相关操作
|
|
18
6
|
* @public
|
|
19
7
|
*/
|
|
20
|
-
export declare abstract class DbQuery {
|
|
21
|
-
|
|
22
|
-
abstract
|
|
23
|
-
/** 单语句查询,不应查询条语句,否则返回错误值 */
|
|
24
|
-
abstract query<T = any>(sql: {
|
|
25
|
-
toString(): string;
|
|
26
|
-
}): Promise<QueryRowsResult<T>>;
|
|
27
|
-
/** 多语句查询 */
|
|
28
|
-
abstract multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: SqlStatementDataset<T>): Promise<T>;
|
|
29
|
-
/** 多语句查询 */
|
|
30
|
-
abstract multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: {
|
|
31
|
-
toString(): string;
|
|
32
|
-
}): Promise<T>;
|
|
8
|
+
export declare abstract class DbQuery implements DbQueryBase {
|
|
9
|
+
abstract query<T = any>(sql: StringLike): Promise<QueryRowsResult<T>>;
|
|
10
|
+
abstract multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: StringLike): Promise<T>;
|
|
33
11
|
/** 单语句查询受影响的行 */
|
|
34
|
-
queryCount(sql: string |
|
|
35
|
-
|
|
36
|
-
}): Promise<number>;
|
|
37
|
-
/** 单语句查询,不应查询条语句,否则返回错误值 */
|
|
12
|
+
queryCount(sql: string | StringLike): Promise<number>;
|
|
13
|
+
/** 单语句查询,不应查询多语句,否则返回错误值 */
|
|
38
14
|
queryRows<T = any>(sql: SqlStatementDataset<T>): Promise<T[]>;
|
|
39
|
-
/**
|
|
40
|
-
queryRows<T = any>(sql:
|
|
41
|
-
|
|
42
|
-
|
|
15
|
+
/** 单语句查询,不应查询多语句,否则返回错误值 */
|
|
16
|
+
queryRows<T = any>(sql: StringLike): Promise<T[]>;
|
|
17
|
+
/** 单语句查询,只返回第一行。如果查询没有返回行,则抛出异常。 */
|
|
18
|
+
queryFirstRow<T = any>(sql: SqlStatementDataset<T>): Promise<T>;
|
|
19
|
+
queryFirstRow<T = any>(sql: StringLike): Promise<T>;
|
|
43
20
|
/**
|
|
44
21
|
* 查询行
|
|
45
22
|
* 不应查询单条语句,否则返回错误值
|
|
@@ -47,22 +24,18 @@ export declare abstract class DbQuery {
|
|
|
47
24
|
multipleQueryRows<T extends any[] = any[]>(sql: SqlStatementDataset<T>): Promise<T[]>;
|
|
48
25
|
/**
|
|
49
26
|
* 查询行
|
|
50
|
-
*
|
|
27
|
+
* 不应查询单语句,否则返回错误值
|
|
51
28
|
*/
|
|
52
|
-
multipleQueryRows<T extends any[] = any[]>(sql:
|
|
53
|
-
toString(): string;
|
|
54
|
-
}): Promise<T[]>;
|
|
29
|
+
multipleQueryRows<T extends any[] = any[]>(sql: StringLike): Promise<T[]>;
|
|
55
30
|
/**
|
|
56
31
|
* 指定某一列为key,返回 key 到 row 的映射
|
|
57
|
-
*
|
|
32
|
+
* 单语句查询,不应查询多语句,否则返回错误值
|
|
58
33
|
*/
|
|
59
34
|
queryMap<T extends Record<string, any> = Record<string, any>, K extends keyof T = string>(sql: SqlStatementDataset<T>, key: K): Promise<Map<T[K], T>>;
|
|
60
35
|
/**
|
|
61
36
|
* 指定某一列为key,返回 key 到 row 的映射
|
|
62
|
-
*
|
|
37
|
+
* 单语句查询,不应查询多语句,否则返回错误值
|
|
63
38
|
*/
|
|
64
|
-
queryMap<T extends Record<string, any> = Record<string, any>, K extends keyof T = string>(sql:
|
|
65
|
-
toString(): string;
|
|
66
|
-
}, key: K): Promise<Map<T[K], T>>;
|
|
39
|
+
queryMap<T extends Record<string, any> = Record<string, any>, K extends keyof T = string>(sql: StringLike, key: K): Promise<Map<T[K], T>>;
|
|
67
40
|
}
|
|
68
41
|
//# sourceMappingURL=DbQuery.d.ts.map
|
package/dist/client/DbQuery.js
CHANGED
|
@@ -14,6 +14,13 @@ class DbQuery {
|
|
|
14
14
|
queryRows(sql) {
|
|
15
15
|
return this.query(sql.toString()).then((res) => res.rows);
|
|
16
16
|
}
|
|
17
|
+
queryFirstRow(sql) {
|
|
18
|
+
return this.query(sql.toString()).then(({ rows, rowCount }) => {
|
|
19
|
+
if (rows.length === 0)
|
|
20
|
+
throw new Error("Query did not return any rows");
|
|
21
|
+
return rows[0];
|
|
22
|
+
});
|
|
23
|
+
}
|
|
17
24
|
multipleQueryRows(sql) {
|
|
18
25
|
return this.multipleQuery(sql.toString()).then((res) => res.map((item) => item.rows ?? []));
|
|
19
26
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { SqlStatementDataset } from "../sql_gen/mod.ts";
|
|
2
|
+
import { StringLike } from "./interfaces.ts";
|
|
3
|
+
/** @public */
|
|
4
|
+
export interface SingleQueryResult {
|
|
5
|
+
rowCount: number;
|
|
6
|
+
rows?: any[];
|
|
7
|
+
}
|
|
8
|
+
/** @public */
|
|
9
|
+
export interface QueryRowsResult<T = any> extends SingleQueryResult {
|
|
10
|
+
rowCount: number;
|
|
11
|
+
rows: T[];
|
|
12
|
+
}
|
|
13
|
+
/** @public */
|
|
14
|
+
export type MultipleQueryResult = SingleQueryResult[];
|
|
15
|
+
/** @public */
|
|
16
|
+
export type QueryResult = MultipleQueryResult | SingleQueryResult;
|
|
17
|
+
/** @public */
|
|
18
|
+
export interface DbQueryBase {
|
|
19
|
+
/** 单语句查询,不应查询多语句,否则返回错误值 */
|
|
20
|
+
query<T = any>(sql: SqlStatementDataset<T>): Promise<QueryRowsResult<T>>;
|
|
21
|
+
/** 单语句查询,不应查询多语句,否则返回错误值 */
|
|
22
|
+
query<T = any>(sql: StringLike): Promise<QueryRowsResult<T>>;
|
|
23
|
+
/** 多语句查询 */
|
|
24
|
+
multipleQuery<T extends MultipleQueryResult = MultipleQueryResult>(sql: StringLike): Promise<T>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=DbQueryBase.d.ts.map
|
|
@@ -59,8 +59,10 @@ export interface DbQueryPool extends DbQuery {
|
|
|
59
59
|
totalCount: number;
|
|
60
60
|
begin(mode?: TransactionMode): DbTransaction;
|
|
61
61
|
cursor<T extends {}>(sql: SqlStatementDataset<T>): Promise<DbCursor<T>>;
|
|
62
|
-
cursor<T>(sql:
|
|
63
|
-
toString(): string;
|
|
64
|
-
}, option?: DbCursorOption): Promise<DbCursor<T>>;
|
|
62
|
+
cursor<T>(sql: StringLike, option?: DbCursorOption): Promise<DbCursor<T>>;
|
|
65
63
|
}
|
|
64
|
+
/** @public */
|
|
65
|
+
export type StringLike = {
|
|
66
|
+
toString(): string;
|
|
67
|
+
} | string;
|
|
66
68
|
//# sourceMappingURL=interfaces.d.ts.map
|
package/dist/client/mod.d.ts
CHANGED
package/dist/sql_gen/mod.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { pgSqlTransformer } from './sql_value/db_type.js';
|
|
2
2
|
import { SqlValuesCreator } from './sql_value/sql_value.js';
|
|
3
|
-
export { SqlRaw } from './sql_value/sql_value.js';
|
|
4
3
|
export { DbTable } from './select/DbTable.js';
|
|
5
4
|
export { Selection, SqlSelectChain } from './select/query_chain_select.js';
|
|
6
5
|
export { SqlStatement, SqlStatementDataset, SqlTextStatementDataset } from './select/chain_base.js';
|
|
@@ -20,6 +20,8 @@ export declare class DbTable<T extends TableType> {
|
|
|
20
20
|
[key: string]: string | boolean;
|
|
21
21
|
}>, as?: string): ChainSelect<Record<string, any>>;
|
|
22
22
|
/** 选择单表 */
|
|
23
|
+
select<R extends {} = Record<string, any>>(columns: Constructable<string | string[]>, as?: string): ChainSelect<R>;
|
|
24
|
+
/** 选择单表 */
|
|
23
25
|
select<R extends {}>(columns: Constructable<{
|
|
24
26
|
[key in keyof R]: boolean | string;
|
|
25
27
|
} | string | string[]>, as?: string): ChainSelect<R>;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { SqlRaw } from "../sql_value/sql_value.ts";
|
|
2
1
|
/**
|
|
3
2
|
* @public
|
|
4
3
|
* @param T - 表格查询类型
|
|
@@ -16,7 +15,7 @@ export type PickColumn<T extends {
|
|
|
16
15
|
};
|
|
17
16
|
/** @public */
|
|
18
17
|
export type UpdateRowValue<T extends object> = {
|
|
19
|
-
[key in keyof T]?: T[key] |
|
|
18
|
+
[key in keyof T]?: T[key] | String;
|
|
20
19
|
};
|
|
21
20
|
/** @public */
|
|
22
21
|
export type OrderValue = "ASC" | "DESC";
|
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
import { SqlStatementDataset } from "../select/chain_base.ts";
|
|
2
|
-
declare const SQL_RAW: unique symbol;
|
|
3
|
-
/**
|
|
4
|
-
* SQL 原始字符类。可以使用 String 类代替,这只是为了推断类型
|
|
5
|
-
* @public
|
|
6
|
-
*/
|
|
7
|
-
export declare class SqlRaw<T = any> extends String {
|
|
8
|
-
/** 保留以推断类型 */
|
|
9
|
-
protected [SQL_RAW]: T;
|
|
10
|
-
}
|
|
11
2
|
/** @public js 对象到编码函数的映射*/
|
|
12
3
|
export type JsObjectMapSql = Map<new (...args: any[]) => any, SqlValueEncoder>;
|
|
13
4
|
/** @public 将 js 值转为 SQl 字符串的函数*/
|
|
@@ -62,6 +53,7 @@ export declare class SqlValuesCreator {
|
|
|
62
53
|
* 将对象列表转为 SQL 的 VALUES。
|
|
63
54
|
* @example 返回示例: " (...),(...) "
|
|
64
55
|
* @param keys - 选择的键。如果指定了 keys, 值为 undefined 的属性将自动填充为 null; 如果未指定 keys,将选择 objectList 所有不是 undefined 项的键的并集
|
|
56
|
+
* @param keepUndefinedKey - 是否保留 undefined 的键。默认值为 false,如果为 true , 数组的某一个字段均为 undefined时,将忽略字段,
|
|
65
57
|
*/
|
|
66
58
|
objectListToValuesList<T extends object>(objectList: T[], keys?: readonly (keyof T)[] | {
|
|
67
59
|
[key in keyof T]?: string | undefined | ColumnToValueConfig;
|
|
@@ -77,7 +69,10 @@ export declare class SqlValuesCreator {
|
|
|
77
69
|
private _internalObjectToValues;
|
|
78
70
|
/**
|
|
79
71
|
* 将数组列表转为 SQL 的一个 value
|
|
80
|
-
* @example
|
|
72
|
+
* @example
|
|
73
|
+
* ```ts
|
|
74
|
+
* v.toValues([1, "abc", null, undefined, { key: "value" }]) // `1,'abc',NULL,DEFAULT,'{"key":"value"}'`
|
|
75
|
+
* ```
|
|
81
76
|
*/
|
|
82
77
|
toValues(values: readonly any[]): string;
|
|
83
78
|
/**
|
|
@@ -103,5 +98,4 @@ export type ColumnToValueConfig = {
|
|
|
103
98
|
sqlType?: string;
|
|
104
99
|
assertJsType?: AssertJsType;
|
|
105
100
|
};
|
|
106
|
-
export {};
|
|
107
101
|
//# sourceMappingURL=sql_value.d.ts.map
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { getObjectListKeys } from '../util.js';
|
|
2
2
|
import { SqlStatementDataset } from '../select/chain_base.js';
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* SQL 原始字符类。可以使用 String 类代替,这只是为了推断类型
|
|
6
|
-
* @public
|
|
7
|
-
*/
|
|
8
|
-
class SqlRaw extends String {
|
|
9
|
-
}
|
|
10
4
|
/**
|
|
11
5
|
* SQL value 生成器
|
|
12
6
|
* @public
|
|
@@ -84,7 +78,7 @@ class SqlValuesCreator {
|
|
|
84
78
|
case "string":
|
|
85
79
|
return SqlValuesCreator.string(value);
|
|
86
80
|
case "boolean":
|
|
87
|
-
return value
|
|
81
|
+
return value ? "TRUE" : "FALSE";
|
|
88
82
|
case "object": {
|
|
89
83
|
if (value instanceof String)
|
|
90
84
|
return value.toString();
|
|
@@ -203,13 +197,20 @@ class SqlValuesCreator {
|
|
|
203
197
|
let message = error instanceof Error ? error.message : String(error);
|
|
204
198
|
throw new Error("字段 '" + key + "' 异常," + message);
|
|
205
199
|
}
|
|
200
|
+
if (values.length === 0)
|
|
201
|
+
throw new Error("object 不能为空");
|
|
206
202
|
return values.join(",");
|
|
207
203
|
}
|
|
208
204
|
/**
|
|
209
205
|
* 将数组列表转为 SQL 的一个 value
|
|
210
|
-
* @example
|
|
206
|
+
* @example
|
|
207
|
+
* ```ts
|
|
208
|
+
* v.toValues([1, "abc", null, undefined, { key: "value" }]) // `1,'abc',NULL,DEFAULT,'{"key":"value"}'`
|
|
209
|
+
* ```
|
|
211
210
|
*/
|
|
212
211
|
toValues(values) {
|
|
212
|
+
if (values.length === 0)
|
|
213
|
+
throw new Error("values 不能为空");
|
|
213
214
|
return values.map((v) => this.toSqlStr(v)).join(",");
|
|
214
215
|
}
|
|
215
216
|
createValues(asName, values, valuesTypes) {
|
|
@@ -301,4 +302,4 @@ class AssertError extends TypeError {
|
|
|
301
302
|
}
|
|
302
303
|
}
|
|
303
304
|
|
|
304
|
-
export {
|
|
305
|
+
export { SqlValuesCreator };
|