@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 CHANGED
@@ -18,17 +18,16 @@ SQL 生成器
18
18
 
19
19
  [API 文档](https://jsr.io/@asla/yoursql/doc)
20
20
 
21
- ### 安全转将 JS 值转换为 SQL 值,避免 SQL 注入
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
- // implement
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 "./DbQuery.ts";
4
- import type { DbConnection, TransactionMode } from "./interfaces.ts";
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: DbConnection, onRelease: () => void);
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
- toString(): string;
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
- if (this.#conn) {
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 "./DbQuery.ts";
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
  }
@@ -1,45 +1,22 @@
1
1
  import type { SqlStatementDataset } from "../sql_gen/mod.ts";
2
- /** @public */
3
- export interface SingleQueryResult {
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 query<T = any>(sql: SqlStatementDataset<T>): Promise<QueryRowsResult<T>>;
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
- toString(): string;
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
- toString(): string;
42
- }): Promise<T[]>;
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
@@ -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
@@ -1,5 +1,6 @@
1
1
  export * from "./errors.ts";
2
2
  export * from "./interfaces.ts";
3
+ export * from "./DbQueryBase.ts";
3
4
  export * from "./DbQuery.ts";
4
5
  export * from "./DbCursor.ts";
5
6
  export * from "./DbPoolConnection.ts";
@@ -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] | SqlRaw;
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 返回示例: " 'abc', '6', 'now()' "
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.toString();
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 返回示例: " 'abc', '6', 'now()' "
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 { SqlRaw, SqlValuesCreator };
305
+ export { SqlValuesCreator };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asla/yoursql",
3
- "version": "0.8.7",
3
+ "version": "0.8.9",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "types": "./dist/mod.d.ts",