@asla/yoursql 0.13.0 → 0.14.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.md +22 -206
- package/dist/sql_gen/SqlStatement.d.ts +0 -1
- package/dist/sql_gen/SqlStatement.js +3 -5
- package/dist/sql_gen/_statement.d.ts +0 -1
- package/dist/sql_gen/_statement.js +10 -13
- package/dist/sql_gen/mod.d.ts +0 -1
- package/dist/sql_gen/mod.js +10 -19
- package/dist/sql_gen/sql_value/SqlValuesDataset.d.ts +28 -0
- package/dist/sql_gen/sql_value/SqlValuesDataset.js +51 -0
- package/dist/sql_gen/sql_value/ValueSqlTemplate.d.ts +0 -1
- package/dist/sql_gen/sql_value/ValueSqlTemplate.js +2 -5
- package/dist/sql_gen/sql_value/_to_values.d.ts +0 -1
- package/dist/sql_gen/sql_value/_to_values.js +5 -8
- package/dist/sql_gen/sql_value/db_type.d.ts +0 -1
- package/dist/sql_gen/sql_value/db_type.js +2 -5
- package/dist/sql_gen/sql_value/sql_value.d.ts +3 -25
- package/dist/sql_gen/sql_value/sql_value.js +7 -60
- package/dist/sql_gen/sql_value/type.d.ts +0 -1
- package/dist/sql_gen/sql_value/type.js +1 -0
- package/dist/sql_gen/statement/_modify.d.ts +0 -1
- package/dist/sql_gen/statement/_modify.js +1 -0
- package/dist/sql_gen/statement/cte.d.ts +0 -1
- package/dist/sql_gen/statement/cte.js +7 -10
- package/dist/sql_gen/statement/delete.d.ts +0 -1
- package/dist/sql_gen/statement/delete.js +2 -5
- package/dist/sql_gen/statement/delete_chain.d.ts +0 -1
- package/dist/sql_gen/statement/delete_chain.js +1 -0
- package/dist/sql_gen/statement/delete_impl.d.ts +0 -1
- package/dist/sql_gen/statement/delete_impl.js +3 -6
- package/dist/sql_gen/statement/insert.d.ts +0 -1
- package/dist/sql_gen/statement/insert.js +2 -5
- package/dist/sql_gen/statement/insert_chain.d.ts +8 -1
- package/dist/sql_gen/statement/insert_chain.js +1 -0
- package/dist/sql_gen/statement/insert_impl.d.ts +0 -1
- package/dist/sql_gen/statement/insert_impl.js +4 -7
- package/dist/sql_gen/statement/mod.d.ts +0 -1
- package/dist/sql_gen/statement/mod.js +9 -0
- package/dist/sql_gen/statement/select.d.ts +0 -1
- package/dist/sql_gen/statement/select.js +4 -7
- package/dist/sql_gen/statement/select_chain.d.ts +0 -1
- package/dist/sql_gen/statement/select_chain.js +1 -0
- package/dist/sql_gen/statement/select_impl.d.ts +0 -1
- package/dist/sql_gen/statement/select_impl.js +4 -7
- package/dist/sql_gen/statement/update.d.ts +0 -1
- package/dist/sql_gen/statement/update.js +2 -5
- package/dist/sql_gen/statement/update_chain.d.ts +0 -1
- package/dist/sql_gen/statement/update_chain.js +1 -0
- package/dist/sql_gen/statement/update_impl.d.ts +0 -1
- package/dist/sql_gen/statement/update_impl.js +4 -7
- package/dist/sql_gen/util.d.ts +0 -1
- package/dist/sql_gen/util.js +1 -3
- package/dist/sql_gen/your_table/checker.d.ts +0 -1
- package/dist/sql_gen/your_table/checker.js +2 -5
- package/dist/sql_gen/your_table/infer_db_type.d.ts +0 -1
- package/dist/sql_gen/your_table/infer_db_type.js +3 -5
- package/dist/sql_gen/your_table/mod.d.ts +0 -1
- package/dist/sql_gen/your_table/mod.js +3 -0
- package/dist/sql_gen/your_table/table.d.ts +0 -1
- package/dist/sql_gen/your_table/table.js +2 -5
- package/package.json +31 -34
- package/dist/client/DbCursor.d.ts +0 -14
- package/dist/client/DbCursor.js +0 -21
- package/dist/client/DbPoolConnection.d.ts +0 -5
- package/dist/client/DbPoolConnection.js +0 -74
- package/dist/client/DbPoolTransaction.d.ts +0 -9
- package/dist/client/DbPoolTransaction.js +0 -146
- package/dist/client/DbQuery.d.ts +0 -50
- package/dist/client/DbQuery.js +0 -42
- package/dist/client/DbQueryBase.d.ts +0 -38
- package/dist/client/DbQueryBase.js +0 -32
- package/dist/client/DbQueryPool.d.ts +0 -39
- package/dist/client/DbQueryPool.js +0 -56
- package/dist/client/_type.d.ts +0 -2
- package/dist/client/errors.d.ts +0 -9
- package/dist/client/errors.js +0 -14
- package/dist/client/interfaces.d.ts +0 -87
- package/dist/client/mod.d.ts +0 -9
- package/dist/client/mod.js +0 -7
package/README.md
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
[![ESM package][package]][package-url]
|
|
2
|
-
[![
|
|
3
|
-
[![JSR version][jsr]][jsr-url]
|
|
4
|
-
[![Install size][size]][size-url]
|
|
1
|
+
[![ESM package][package]][package-url] [![NPM version][npm]][npm-url]
|
|
2
|
+
[![JSR version][jsr]][jsr-url] [![Install size][size]][size-url]
|
|
5
3
|
|
|
6
4
|
[package]: https://img.shields.io/badge/package-ESM-ffe536.svg
|
|
7
5
|
[package-url]: https://nodejs.org/api/esm.html
|
|
@@ -23,7 +21,8 @@ SQL 生成器
|
|
|
23
21
|
安全转将 JS 值转换为 SQL 值,避免 SQL 注入
|
|
24
22
|
|
|
25
23
|
`v` 函数能够将 JS 值转换为 SQL 的文本形式。\
|
|
26
|
-
默认情况下,支持 PostgresSQL,
|
|
24
|
+
默认情况下,支持 PostgresSQL,
|
|
25
|
+
因为不同数据库的值转换有些差异,如果使用其他数据库,可能需要配置对象到字符串的自定义转换器
|
|
27
26
|
|
|
28
27
|
```ts
|
|
29
28
|
import { v } from "@asla/yoursql";
|
|
@@ -41,7 +40,8 @@ const params = { id: 3 };
|
|
|
41
40
|
const sql = `SELECT * FROM user WHERE user_id=${v(params.id)}`;
|
|
42
41
|
```
|
|
43
42
|
|
|
44
|
-
如果传入 String 对象,将保留其字符串值,不会进行任何转换,
|
|
43
|
+
如果传入 String 对象,将保留其字符串值,不会进行任何转换,
|
|
44
|
+
这在有些需要原生SQL操作的场景下非常有用
|
|
45
45
|
|
|
46
46
|
```ts
|
|
47
47
|
import { v } from "@asla/yoursql";
|
|
@@ -49,7 +49,8 @@ import { v } from "@asla/yoursql";
|
|
|
49
49
|
v(new String("1+1")); // "1+1"
|
|
50
50
|
```
|
|
51
51
|
|
|
52
|
-
你可以自定义对象到字符串的转换, 例如,你想将 Set 转换为 PostgresSql 的 ARRAY[]
|
|
52
|
+
你可以自定义对象到字符串的转换, 例如,你想将 Set 转换为 PostgresSql 的 ARRAY[]
|
|
53
|
+
输入格式
|
|
53
54
|
|
|
54
55
|
```ts
|
|
55
56
|
import { v } from "@asla/yoursql";
|
|
@@ -70,42 +71,34 @@ import { v } from "@asla/yoursql";
|
|
|
70
71
|
v.toValues([1, "abc", null, undefined, { key: "value" }]); // `1,'abc',NULL,DEFAULT,'{"key":"value"}'`
|
|
71
72
|
```
|
|
72
73
|
|
|
73
|
-
#### v.
|
|
74
|
+
#### v.createExplicitValues() 和 v.createImplicitValues()
|
|
74
75
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
```ts
|
|
78
|
-
import { v } from "@asla/yoursql";
|
|
79
|
-
const obj = { a: "a1", b: "b1", c: undefined, d: "d1" };
|
|
80
|
-
v.objectToValue(obj); // "'a1','b1',DEFAULT,'d1'"
|
|
81
|
-
v.objectToValue(obj, ["b", "a"]); // "'b1','a1'"
|
|
82
|
-
v.objectToValue(obj, [{ a: "TEXT", b: {} }]); // 'a1'::TEXT,'b1'"
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
#### v.objectListToValues()
|
|
86
|
-
|
|
87
|
-
转换对象数组为 values
|
|
76
|
+
转换单个对象或对象数组为 VALUES
|
|
88
77
|
|
|
89
78
|
```ts
|
|
90
79
|
import { v } from "@asla/yoursql";
|
|
91
80
|
|
|
92
|
-
const values = [{ a: 1, b:
|
|
81
|
+
const values = [{ a: 1, b: undefined }, { c: 3 }];
|
|
93
82
|
|
|
94
83
|
// 这将自动选择数组中所有键的并集
|
|
95
|
-
v.
|
|
84
|
+
v.createExplicitValues(values).text; // "(1,NULL,NULL),(NULL,NULL,3)"
|
|
85
|
+
v.createImplicitValues(values).text; // "(1,DEFAULT,NULL),(NULL,NULL,3)"
|
|
96
86
|
|
|
97
87
|
// 或者你可以指定选择键并指定顺序
|
|
98
|
-
const valueStr = v.
|
|
88
|
+
const valueStr = v.createExplicitValues(values, ["c", "b"]).text; // "(NULL,2),(3,NULL)"
|
|
99
89
|
|
|
100
90
|
const sql = `INSERT INTO user(name, role) VALUES ${valueStr}`;
|
|
101
91
|
```
|
|
102
92
|
|
|
103
|
-
|
|
93
|
+
可以指定 SQL类型和 JS 类型断言
|
|
104
94
|
|
|
105
95
|
```ts
|
|
106
|
-
const objectList = [{ age: 1, name: "hhh" }, { age: 2, name: "row2" }, {
|
|
96
|
+
const objectList = [{ age: 1, name: "hhh" }, { age: 2, name: "row2" }, {
|
|
97
|
+
age: 3,
|
|
98
|
+
name: "row3",
|
|
99
|
+
}, {}];
|
|
107
100
|
|
|
108
|
-
v.
|
|
101
|
+
v.createExplicitValues("customName", objectList, {
|
|
109
102
|
age: { sqlType: "INT", sqlDefault: "MAXIMUM(1,2)" },
|
|
110
103
|
name: "TEXT",
|
|
111
104
|
});
|
|
@@ -131,8 +124,8 @@ const s = select({ uid: "u.id", rid: "r.id", example: "u.id||r.id" })
|
|
|
131
124
|
.toString();
|
|
132
125
|
```
|
|
133
126
|
|
|
134
|
-
查看 [select](./docs/select.md) 用法
|
|
135
|
-
|
|
127
|
+
查看 [select](./docs/select.md) 用法 查看
|
|
128
|
+
[insert/update/delete](./docs/table.md) 用法
|
|
136
129
|
|
|
137
130
|
#### Constructable
|
|
138
131
|
|
|
@@ -141,180 +134,3 @@ toto
|
|
|
141
134
|
#### ConditionParam
|
|
142
135
|
|
|
143
136
|
toto
|
|
144
|
-
|
|
145
|
-
### client 抽象类
|
|
146
|
-
|
|
147
|
-
yoursql 还导出了一些抽象类,实现抽象类后可以方便的进行数据查询
|
|
148
|
-
|
|
149
|
-
```ts
|
|
150
|
-
import {
|
|
151
|
-
type DbQueryPool,
|
|
152
|
-
type DbTransaction,
|
|
153
|
-
type DbConnection,
|
|
154
|
-
DbQuery,
|
|
155
|
-
DbCursor,
|
|
156
|
-
DbPoolConnection,
|
|
157
|
-
DbPoolTransaction,
|
|
158
|
-
} from "@asla/yoursql/client";
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
#### DbQuery 抽象类
|
|
162
|
-
|
|
163
|
-
```ts
|
|
164
|
-
class YourQuery extends DbQuery {
|
|
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
|
-
}
|
|
171
|
-
}
|
|
172
|
-
const db: DbQuery = new YourQuery();
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
```ts
|
|
176
|
-
declare const db: DbQuery;
|
|
177
|
-
|
|
178
|
-
type Row = { name: string; age: number };
|
|
179
|
-
const sqlText = "SELECT * FROM user";
|
|
180
|
-
|
|
181
|
-
const rows: Row[] = await db.queryRows<Row>(sqlText);
|
|
182
|
-
const count: number = await db.queryCount(sqlText);
|
|
183
|
-
const rows: Map<string, Row> = await db.queryMap<Row>(sqlText, "name");
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
#### DbQueryPool 接口
|
|
187
|
-
|
|
188
|
-
```ts
|
|
189
|
-
class YourPool extends DbQuery implements DbQuery {
|
|
190
|
-
// implement
|
|
191
|
-
}
|
|
192
|
-
const pool: DbQueryPool = new YourPool();
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
##### 普通查询
|
|
196
|
-
|
|
197
|
-
```ts
|
|
198
|
-
const conn = await pool.connect();
|
|
199
|
-
try {
|
|
200
|
-
await conn.queryRows(sqlText);
|
|
201
|
-
} finally {
|
|
202
|
-
conn.release();
|
|
203
|
-
}
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
或者,使用 `using` 语法更优雅
|
|
207
|
-
|
|
208
|
-
```ts
|
|
209
|
-
using conn = await pool.connect();
|
|
210
|
-
await conn.queryRows(sqlText);
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
##### 事务查询
|
|
214
|
-
|
|
215
|
-
```ts
|
|
216
|
-
const conn = pool.begin();
|
|
217
|
-
try {
|
|
218
|
-
await conn.queryRows(sqlText);
|
|
219
|
-
await conn.queryRows(sqlText);
|
|
220
|
-
await conn.commit();
|
|
221
|
-
} catch (e) {
|
|
222
|
-
await conn.rollback();
|
|
223
|
-
throw e;
|
|
224
|
-
}
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
或者,使用 `using` 语法更优雅
|
|
228
|
-
|
|
229
|
-
```ts
|
|
230
|
-
await using conn = pool.begin();
|
|
231
|
-
|
|
232
|
-
await conn.queryRows(sqlText);
|
|
233
|
-
await conn.queryRows(sqlText);
|
|
234
|
-
await conn.commit();
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
##### 游标查询
|
|
238
|
-
|
|
239
|
-
```ts
|
|
240
|
-
const cursor = await pool.cursor(sqlText);
|
|
241
|
-
|
|
242
|
-
let rows = await cursor.read(20);
|
|
243
|
-
while (rows.length) {
|
|
244
|
-
console.log(rows);
|
|
245
|
-
rows = await cursor.read(20);
|
|
246
|
-
if (conditions) {
|
|
247
|
-
await cursor.close(); // 提前关闭游标
|
|
248
|
-
break;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
或者使用 `for await of` 更优雅
|
|
254
|
-
|
|
255
|
-
```ts
|
|
256
|
-
const cursor = await pool.cursor(sqlText);
|
|
257
|
-
for await (const element of cursor) {
|
|
258
|
-
console.log(element);
|
|
259
|
-
if (conditions) break; //提前关闭游标
|
|
260
|
-
}
|
|
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,12 +1,12 @@
|
|
|
1
1
|
/** @public */
|
|
2
|
-
class SqlStatement {
|
|
2
|
+
export class SqlStatement {
|
|
3
3
|
/** 获取 SQL 语句 */
|
|
4
4
|
toString() {
|
|
5
5
|
return this.genSql();
|
|
6
6
|
}
|
|
7
7
|
}
|
|
8
8
|
/** @public */
|
|
9
|
-
class SqlStatementDataset extends SqlStatement {
|
|
9
|
+
export class SqlStatementDataset extends SqlStatement {
|
|
10
10
|
/**
|
|
11
11
|
* 转成子选择语句, 你可以使用 select form xxx 选择
|
|
12
12
|
* 如果是 table 则是 table name
|
|
@@ -26,7 +26,7 @@ class SqlStatementDataset extends SqlStatement {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
/** @public */
|
|
29
|
-
class SqlTextStatementDataset extends SqlStatementDataset {
|
|
29
|
+
export class SqlTextStatementDataset extends SqlStatementDataset {
|
|
30
30
|
sql;
|
|
31
31
|
constructor(sql) {
|
|
32
32
|
super();
|
|
@@ -36,5 +36,3 @@ class SqlTextStatementDataset extends SqlStatementDataset {
|
|
|
36
36
|
return this.sql;
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
|
|
40
|
-
export { SqlStatement, SqlStatementDataset, SqlTextStatementDataset };
|
|
@@ -26,4 +26,3 @@ export declare function whereToString(conditions?: Constructable<ConditionParam
|
|
|
26
26
|
export declare function createUpdateSetFromObject(set: Record<string, string | undefined>, prefix?: string): string;
|
|
27
27
|
export declare function selectableToString(selectable: Constructable<SqlSelectable | string>, as?: string): string;
|
|
28
28
|
export declare function returningToString(returns: Constructable<SelectParam | "*">): string;
|
|
29
|
-
//# sourceMappingURL=_statement.d.ts.map
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { selectColumns } from
|
|
2
|
-
|
|
1
|
+
import { selectColumns } from "./util.js";
|
|
3
2
|
/**
|
|
4
3
|
* 获取对象数组中的 key 的集合
|
|
5
4
|
* @param keepUndefinedKey - 是否保留值为 undefined 的 key
|
|
6
5
|
*/
|
|
7
|
-
function getObjectListKeys(objectList, keepUndefinedKey) {
|
|
6
|
+
export function getObjectListKeys(objectList, keepUndefinedKey) {
|
|
8
7
|
let keys = new Set();
|
|
9
8
|
for (let i = 0; i < objectList.length; i++) {
|
|
10
9
|
let obj = objectList[i];
|
|
@@ -14,14 +13,14 @@ function getObjectListKeys(objectList, keepUndefinedKey) {
|
|
|
14
13
|
k = hasKeys[j];
|
|
15
14
|
if (typeof k !== "string")
|
|
16
15
|
continue;
|
|
17
|
-
if (obj[k] === undefined)
|
|
16
|
+
if (!keepUndefinedKey && obj[k] === undefined)
|
|
18
17
|
continue;
|
|
19
18
|
keys.add(k);
|
|
20
19
|
}
|
|
21
20
|
}
|
|
22
21
|
return keys;
|
|
23
22
|
}
|
|
24
|
-
function condition(conditions, type = "AND") {
|
|
23
|
+
export function condition(conditions, type = "AND") {
|
|
25
24
|
if (typeof conditions === "function")
|
|
26
25
|
conditions = conditions();
|
|
27
26
|
if (!conditions)
|
|
@@ -53,13 +52,13 @@ function condition(conditions, type = "AND") {
|
|
|
53
52
|
* where(undefined) // ""
|
|
54
53
|
* ```
|
|
55
54
|
*/
|
|
56
|
-
function whereToString(conditions, type) {
|
|
55
|
+
export function whereToString(conditions, type) {
|
|
57
56
|
const sql = condition(conditions, type);
|
|
58
57
|
if (sql)
|
|
59
58
|
return "\nWHERE " + sql;
|
|
60
59
|
return "";
|
|
61
60
|
}
|
|
62
|
-
function createUpdateSetFromObject(set, prefix) {
|
|
61
|
+
export function createUpdateSetFromObject(set, prefix) {
|
|
63
62
|
const updateKey = Object.keys(set);
|
|
64
63
|
let i = 0;
|
|
65
64
|
let key;
|
|
@@ -68,7 +67,7 @@ function createUpdateSetFromObject(set, prefix) {
|
|
|
68
67
|
let sql;
|
|
69
68
|
for (; i < updateKey.length; i++) {
|
|
70
69
|
key = updateKey[i];
|
|
71
|
-
sqlKey = key;
|
|
70
|
+
sqlKey = prefix ? `${prefix}.${key}` : key;
|
|
72
71
|
value = set[key];
|
|
73
72
|
if (value === undefined)
|
|
74
73
|
continue;
|
|
@@ -85,7 +84,7 @@ function createUpdateSetFromObject(set, prefix) {
|
|
|
85
84
|
i++;
|
|
86
85
|
for (; i < updateKey.length; i++) {
|
|
87
86
|
key = updateKey[i];
|
|
88
|
-
sqlKey = key;
|
|
87
|
+
sqlKey = prefix ? `${prefix}.${key}` : key;
|
|
89
88
|
value = set[key];
|
|
90
89
|
if (value === undefined)
|
|
91
90
|
continue;
|
|
@@ -101,7 +100,7 @@ function createUpdateSetFromObject(set, prefix) {
|
|
|
101
100
|
else
|
|
102
101
|
throw new Error("值不能为空");
|
|
103
102
|
}
|
|
104
|
-
function selectableToString(selectable, as) {
|
|
103
|
+
export function selectableToString(selectable, as) {
|
|
105
104
|
if (typeof selectable === "function")
|
|
106
105
|
selectable = selectable();
|
|
107
106
|
let sql = typeof selectable === "string" ? selectable : selectable.toSelect();
|
|
@@ -111,7 +110,7 @@ function selectableToString(selectable, as) {
|
|
|
111
110
|
sql += " AS " + as;
|
|
112
111
|
return sql;
|
|
113
112
|
}
|
|
114
|
-
function returningToString(returns) {
|
|
113
|
+
export function returningToString(returns) {
|
|
115
114
|
if (typeof returns === "function")
|
|
116
115
|
returns = returns();
|
|
117
116
|
let columnsStr;
|
|
@@ -123,5 +122,3 @@ function returningToString(returns) {
|
|
|
123
122
|
}
|
|
124
123
|
return "\nRETURNING " + columnsStr;
|
|
125
124
|
}
|
|
126
|
-
|
|
127
|
-
export { condition, createUpdateSetFromObject, getObjectListKeys, returningToString, selectableToString, whereToString };
|
package/dist/sql_gen/mod.d.ts
CHANGED
package/dist/sql_gen/mod.js
CHANGED
|
@@ -1,23 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export { selectColumns } from './util.js';
|
|
11
|
-
export { TypeChecker } from './your_table/checker.js';
|
|
12
|
-
export { ColumnMeta, CustomDbType, YourTypeMap } from './your_table/infer_db_type.js';
|
|
13
|
-
export { YourTable } from './your_table/table.js';
|
|
14
|
-
export { TemplateSqlStatement as ValueSqlTemplate } from './sql_value/ValueSqlTemplate.js';
|
|
15
|
-
export { orderBy } from './statement/select_impl.js';
|
|
16
|
-
|
|
1
|
+
export * from "./sql_value/db_type.js";
|
|
2
|
+
export * from "./sql_value/sql_value.js";
|
|
3
|
+
export * from "./sql_value/type.js";
|
|
4
|
+
export * from "./SqlStatement.js";
|
|
5
|
+
export * from "./statement/mod.js";
|
|
6
|
+
export * from "./util.js";
|
|
7
|
+
export * from "./your_table/mod.js";
|
|
8
|
+
import { SqlValuesCreator } from "./sql_value/sql_value.js";
|
|
9
|
+
import { pgSqlTransformer } from "./sql_value/db_type.js";
|
|
17
10
|
/**
|
|
18
11
|
* 默认的 SqlValuesCreator 实列
|
|
19
12
|
* @public
|
|
20
13
|
*/
|
|
21
|
-
const v = SqlValuesCreator.create(pgSqlTransformer);
|
|
22
|
-
|
|
23
|
-
export { SqlValuesCreator, pgSqlTransformer, v };
|
|
14
|
+
export const v = SqlValuesCreator.create(pgSqlTransformer);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** @public */
|
|
2
|
+
export interface SqlValuesDataset {
|
|
3
|
+
readonly columns: readonly string[];
|
|
4
|
+
readonly text: string;
|
|
5
|
+
toSelect(name: string): string;
|
|
6
|
+
}
|
|
7
|
+
export declare class ExplicitSqlValues implements SqlValuesDataset {
|
|
8
|
+
#private;
|
|
9
|
+
columns: readonly string[];
|
|
10
|
+
readonly columnsSqlType: readonly string[];
|
|
11
|
+
constructor(columns: readonly string[], columnsSqlType: readonly string[], firstValues: string[], nextRows: string[]);
|
|
12
|
+
get text(): string;
|
|
13
|
+
/**
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const t = v.createImplicitValues(
|
|
17
|
+
* [
|
|
18
|
+
* { id: 1, name: "name1" },
|
|
19
|
+
* { id: 2, name: "name2" },
|
|
20
|
+
* ],
|
|
21
|
+
* { id: "INT", name: "VARCHAR" },
|
|
22
|
+
* );
|
|
23
|
+
* // 返回 (VALUES (1::INT,'name1'::VARCHAR),(2,'name2')) AS t1(id,name)
|
|
24
|
+
* t.toSelect("t1(id,name)")
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
toSelect(name: string): string;
|
|
28
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export class ExplicitSqlValues {
|
|
2
|
+
columns;
|
|
3
|
+
columnsSqlType;
|
|
4
|
+
constructor(columns, columnsSqlType, firstValues, nextRows) {
|
|
5
|
+
this.columns = columns;
|
|
6
|
+
this.columnsSqlType = columnsSqlType;
|
|
7
|
+
this.#firstValues = firstValues;
|
|
8
|
+
this.#rows = nextRows;
|
|
9
|
+
}
|
|
10
|
+
#rows;
|
|
11
|
+
#firstValues;
|
|
12
|
+
#text;
|
|
13
|
+
get text() {
|
|
14
|
+
if (!this.#text) {
|
|
15
|
+
this.#text = this.#genText();
|
|
16
|
+
}
|
|
17
|
+
return this.#text;
|
|
18
|
+
}
|
|
19
|
+
#genText() {
|
|
20
|
+
const { columnsSqlType } = this;
|
|
21
|
+
const firstValues = this.#firstValues;
|
|
22
|
+
let firstRow = new Array(firstValues.length);
|
|
23
|
+
for (let i = 0; i < firstValues.length; i++) {
|
|
24
|
+
firstRow[i] = firstValues[i];
|
|
25
|
+
if (columnsSqlType[i])
|
|
26
|
+
firstRow[i] += "::" + columnsSqlType[i];
|
|
27
|
+
}
|
|
28
|
+
const base = "(" + firstRow.join(",") + ")";
|
|
29
|
+
if (this.#rows.length === 0) {
|
|
30
|
+
return base;
|
|
31
|
+
}
|
|
32
|
+
return "(" + firstRow.join(",") + "),\n" + this.#rows.join(",\n");
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* const t = v.createImplicitValues(
|
|
38
|
+
* [
|
|
39
|
+
* { id: 1, name: "name1" },
|
|
40
|
+
* { id: 2, name: "name2" },
|
|
41
|
+
* ],
|
|
42
|
+
* { id: "INT", name: "VARCHAR" },
|
|
43
|
+
* );
|
|
44
|
+
* // 返回 (VALUES (1::INT,'name1'::VARCHAR),(2,'name2')) AS t1(id,name)
|
|
45
|
+
* t.toSelect("t1(id,name)")
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
toSelect(name) {
|
|
49
|
+
return `(VALUES\n${this.text})\nAS ${name}(${this.columns.join(",")})`;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { SqlStatement } from
|
|
2
|
-
|
|
1
|
+
import { SqlStatement } from "../SqlStatement.js";
|
|
3
2
|
/** @alpha */
|
|
4
|
-
class TemplateSqlStatement extends SqlStatement {
|
|
3
|
+
export class TemplateSqlStatement extends SqlStatement {
|
|
5
4
|
v;
|
|
6
5
|
templates;
|
|
7
6
|
args;
|
|
@@ -45,5 +44,3 @@ class TemplateSqlStatement extends SqlStatement {
|
|
|
45
44
|
return sql;
|
|
46
45
|
}
|
|
47
46
|
}
|
|
48
|
-
|
|
49
|
-
export { TemplateSqlStatement };
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { getObjectListKeys } from
|
|
2
|
-
|
|
3
|
-
function internalObjectToValues(object, keys, type, undefinedDefault, v) {
|
|
1
|
+
import { getObjectListKeys } from "../_statement.js";
|
|
2
|
+
export function internalObjectToValues(object, keys, type, undefinedDefault, v) {
|
|
4
3
|
const values = new Array(keys.length);
|
|
5
4
|
const types = new Array(keys.length);
|
|
6
5
|
let i = 0;
|
|
@@ -32,7 +31,7 @@ function internalObjectToValues(object, keys, type, undefinedDefault, v) {
|
|
|
32
31
|
throw new Error("object 不能为空");
|
|
33
32
|
return { values, types };
|
|
34
33
|
}
|
|
35
|
-
class AssertError extends TypeError {
|
|
34
|
+
export class AssertError extends TypeError {
|
|
36
35
|
constructor(assertType, actual) {
|
|
37
36
|
super(`Assert ${assertType} type, Actual ${actual} type`);
|
|
38
37
|
}
|
|
@@ -53,7 +52,7 @@ function initColumnAssert(keys, keys_types) {
|
|
|
53
52
|
}
|
|
54
53
|
return type;
|
|
55
54
|
}
|
|
56
|
-
function getObjectValueInfo(object, keys_types) {
|
|
55
|
+
export function getObjectValueInfo(object, keys_types) {
|
|
57
56
|
let type;
|
|
58
57
|
let keys;
|
|
59
58
|
if (keys_types instanceof Array) {
|
|
@@ -70,7 +69,7 @@ function getObjectValueInfo(object, keys_types) {
|
|
|
70
69
|
}
|
|
71
70
|
return { keys, type };
|
|
72
71
|
}
|
|
73
|
-
function getColumnInfo(objectList, columns) {
|
|
72
|
+
export function getColumnInfo(objectList, columns) {
|
|
74
73
|
let keys;
|
|
75
74
|
let asserts;
|
|
76
75
|
if (!columns) {
|
|
@@ -87,5 +86,3 @@ function getColumnInfo(objectList, columns) {
|
|
|
87
86
|
}
|
|
88
87
|
return { keys, asserts };
|
|
89
88
|
}
|
|
90
|
-
|
|
91
|
-
export { AssertError, getColumnInfo, getObjectValueInfo, internalObjectToValues };
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { SqlValuesCreator } from
|
|
2
|
-
|
|
1
|
+
import { SqlValuesCreator } from "./sql_value.js";
|
|
3
2
|
/** @public PgSql 转换器 */
|
|
4
|
-
const pgSqlTransformer = new Map([
|
|
3
|
+
export const pgSqlTransformer = new Map([
|
|
5
4
|
[
|
|
6
5
|
Array,
|
|
7
6
|
function encodePgArray(value) {
|
|
@@ -36,5 +35,3 @@ const pgSqlTransformer = new Map([
|
|
|
36
35
|
},
|
|
37
36
|
],
|
|
38
37
|
]);
|
|
39
|
-
|
|
40
|
-
export { pgSqlTransformer };
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { SqlValuesDataset } from "./SqlValuesDataset.ts";
|
|
1
2
|
import { TemplateSqlStatement } from "./ValueSqlTemplate.ts";
|
|
2
3
|
import { AssertJsType, ObjectToValueKeys } from "./type.ts";
|
|
3
|
-
export { TemplateSqlStatement
|
|
4
|
+
export { TemplateSqlStatement } from "./ValueSqlTemplate.ts";
|
|
5
|
+
export type { SqlValuesDataset } from "./SqlValuesDataset.ts";
|
|
4
6
|
/** @public js 对象到编码函数的映射*/
|
|
5
7
|
export type JsObjectMapSql = Map<new (...args: any[]) => any, SqlValueEncoder>;
|
|
6
8
|
/** @public 将 js 值转为 SQl 字符串的函数*/
|
|
@@ -71,27 +73,3 @@ export declare class SqlValuesCreator {
|
|
|
71
73
|
*/
|
|
72
74
|
toValues(values: readonly any[]): string;
|
|
73
75
|
}
|
|
74
|
-
/** @public */
|
|
75
|
-
export declare class SqlValuesDataset {
|
|
76
|
-
#private;
|
|
77
|
-
columns: readonly string[];
|
|
78
|
-
readonly columnsSqlType: readonly string[];
|
|
79
|
-
constructor(columns: readonly string[], columnsSqlType: readonly string[], firstValues: string[], nextRows: string[]);
|
|
80
|
-
get text(): string;
|
|
81
|
-
/**
|
|
82
|
-
* @example
|
|
83
|
-
* ```ts
|
|
84
|
-
* const t = v.createImplicitValues(
|
|
85
|
-
* [
|
|
86
|
-
* { id: 1, name: "name1" },
|
|
87
|
-
* { id: 2, name: "name2" },
|
|
88
|
-
* ],
|
|
89
|
-
* { id: "INT", name: "VARCHAR" },
|
|
90
|
-
* );
|
|
91
|
-
* // 返回 (VALUES (1::INT,'name1'::VARCHAR),(2,'name2')) AS t1(id,name)
|
|
92
|
-
* t.toSelect("t1(id,name)")
|
|
93
|
-
* ```
|
|
94
|
-
*/
|
|
95
|
-
toSelect(name: string): string;
|
|
96
|
-
}
|
|
97
|
-
//# sourceMappingURL=sql_value.d.ts.map
|