kysely 0.27.1 → 0.27.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/cjs/dialect/database-introspector.d.ts +1 -0
- package/dist/cjs/dialect/mssql/mssql-introspector.js +13 -2
- package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +4 -0
- package/dist/cjs/dialect/mssql/mssql-query-compiler.js +8 -0
- package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -0
- package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +1 -1
- package/dist/cjs/dialect/postgres/postgres-driver.js +2 -1
- package/dist/cjs/dialect/postgres/postgres-introspector.js +2 -0
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +1 -0
- package/dist/cjs/driver/database-connection.d.ts +1 -1
- package/dist/cjs/expression/expression-builder.d.ts +30 -4
- package/dist/cjs/expression/expression-builder.js +5 -0
- package/dist/cjs/index.d.ts +7 -1
- package/dist/cjs/index.js +6 -0
- package/dist/cjs/migration/migrator.d.ts +19 -2
- package/dist/cjs/migration/migrator.js +77 -43
- package/dist/cjs/operation-node/add-index-node.js +1 -1
- package/dist/cjs/operation-node/cast-node.d.ts +13 -0
- package/dist/cjs/operation-node/cast-node.js +19 -0
- package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
- package/dist/cjs/operation-node/data-type-node.d.ts +5 -1
- package/dist/cjs/operation-node/data-type-node.js +55 -1
- package/dist/cjs/operation-node/delete-query-node.d.ts +4 -0
- package/dist/cjs/operation-node/delete-query-node.js +12 -0
- package/dist/cjs/operation-node/fetch-node.d.ts +15 -0
- package/dist/cjs/operation-node/fetch-node.js +19 -0
- package/dist/cjs/operation-node/insert-query-node.d.ts +4 -1
- package/dist/cjs/operation-node/insert-query-node.js +5 -0
- package/dist/cjs/operation-node/join-node.d.ts +1 -1
- package/dist/cjs/operation-node/matched-node.d.ts +13 -0
- package/dist/cjs/operation-node/matched-node.js +19 -0
- package/dist/cjs/operation-node/merge-query-node.d.ts +25 -0
- package/dist/cjs/operation-node/merge-query-node.js +45 -0
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +10 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +50 -0
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +10 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +5 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/query-node.d.ts +10 -3
- package/dist/cjs/operation-node/query-node.js +15 -1
- package/dist/cjs/operation-node/select-query-node.d.ts +5 -0
- package/dist/cjs/operation-node/select-query-node.js +6 -0
- package/dist/cjs/operation-node/top-node.d.ts +14 -0
- package/dist/cjs/operation-node/top-node.js +19 -0
- package/dist/cjs/operation-node/update-query-node.d.ts +7 -1
- package/dist/cjs/operation-node/update-query-node.js +11 -0
- package/dist/cjs/parser/binary-operation-parser.d.ts +1 -1
- package/dist/cjs/parser/binary-operation-parser.js +2 -2
- package/dist/cjs/parser/data-type-parser.js +7 -3
- package/dist/cjs/parser/fetch-parser.d.ts +2 -0
- package/dist/cjs/parser/fetch-parser.js +18 -0
- package/dist/cjs/parser/insert-values-parser.d.ts +3 -3
- package/dist/cjs/parser/merge-parser.d.ts +9 -0
- package/dist/cjs/parser/merge-parser.js +32 -0
- package/dist/cjs/parser/table-parser.d.ts +4 -3
- package/dist/cjs/parser/top-parser.d.ts +2 -0
- package/dist/cjs/parser/top-parser.js +20 -0
- package/dist/cjs/plugin/with-schema/with-schema-transformer.js +4 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +99 -0
- package/dist/cjs/query-builder/delete-query-builder.js +120 -0
- package/dist/cjs/query-builder/insert-query-builder.d.ts +73 -3
- package/dist/cjs/query-builder/insert-query-builder.js +242 -0
- package/dist/cjs/query-builder/merge-query-builder.d.ts +557 -0
- package/dist/cjs/query-builder/merge-query-builder.js +518 -0
- package/dist/cjs/query-builder/merge-result.d.ts +4 -0
- package/dist/cjs/query-builder/merge-result.js +10 -0
- package/dist/cjs/query-builder/select-query-builder.d.ts +102 -7
- package/dist/cjs/query-builder/select-query-builder.js +14 -0
- package/dist/cjs/query-builder/update-query-builder.d.ts +82 -3
- package/dist/cjs/query-builder/update-query-builder.js +98 -0
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +10 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +94 -10
- package/dist/cjs/query-compiler/query-compiler.d.ts +2 -1
- package/dist/cjs/query-creator.d.ts +40 -2
- package/dist/cjs/query-creator.js +9 -0
- package/dist/cjs/schema/alter-table-add-index-builder.js +6 -2
- package/dist/cjs/schema/column-definition-builder.d.ts +13 -1
- package/dist/cjs/schema/column-definition-builder.js +15 -1
- package/dist/cjs/util/infer-result.d.ts +2 -1
- package/dist/cjs/util/type-utils.d.ts +3 -2
- package/dist/esm/dialect/database-introspector.d.ts +1 -0
- package/dist/esm/dialect/mssql/mssql-introspector.js +13 -2
- package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +4 -0
- package/dist/esm/dialect/mssql/mssql-query-compiler.js +8 -0
- package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
- package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +1 -1
- package/dist/esm/dialect/postgres/postgres-driver.js +2 -1
- package/dist/esm/dialect/postgres/postgres-introspector.js +2 -0
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -0
- package/dist/esm/driver/database-connection.d.ts +1 -1
- package/dist/esm/expression/expression-builder.d.ts +30 -4
- package/dist/esm/expression/expression-builder.js +5 -0
- package/dist/esm/index.d.ts +7 -1
- package/dist/esm/index.js +6 -0
- package/dist/esm/migration/migrator.d.ts +19 -2
- package/dist/esm/migration/migrator.js +76 -42
- package/dist/esm/operation-node/add-index-node.js +1 -1
- package/dist/esm/operation-node/cast-node.d.ts +13 -0
- package/dist/esm/operation-node/cast-node.js +17 -0
- package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
- package/dist/esm/operation-node/data-type-node.d.ts +5 -1
- package/dist/esm/operation-node/data-type-node.js +53 -0
- package/dist/esm/operation-node/delete-query-node.d.ts +4 -0
- package/dist/esm/operation-node/delete-query-node.js +12 -0
- package/dist/esm/operation-node/fetch-node.d.ts +15 -0
- package/dist/esm/operation-node/fetch-node.js +17 -0
- package/dist/esm/operation-node/insert-query-node.d.ts +4 -1
- package/dist/esm/operation-node/insert-query-node.js +5 -0
- package/dist/esm/operation-node/join-node.d.ts +1 -1
- package/dist/esm/operation-node/matched-node.d.ts +13 -0
- package/dist/esm/operation-node/matched-node.js +17 -0
- package/dist/esm/operation-node/merge-query-node.d.ts +25 -0
- package/dist/esm/operation-node/merge-query-node.js +43 -0
- package/dist/esm/operation-node/operation-node-transformer.d.ts +10 -0
- package/dist/esm/operation-node/operation-node-transformer.js +50 -0
- package/dist/esm/operation-node/operation-node-visitor.d.ts +10 -0
- package/dist/esm/operation-node/operation-node-visitor.js +5 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/query-node.d.ts +10 -3
- package/dist/esm/operation-node/query-node.js +15 -1
- package/dist/esm/operation-node/select-query-node.d.ts +5 -0
- package/dist/esm/operation-node/select-query-node.js +6 -0
- package/dist/esm/operation-node/top-node.d.ts +14 -0
- package/dist/esm/operation-node/top-node.js +17 -0
- package/dist/esm/operation-node/update-query-node.d.ts +7 -1
- package/dist/esm/operation-node/update-query-node.js +11 -0
- package/dist/esm/parser/binary-operation-parser.d.ts +1 -1
- package/dist/esm/parser/binary-operation-parser.js +2 -2
- package/dist/esm/parser/data-type-parser.js +8 -4
- package/dist/esm/parser/fetch-parser.d.ts +2 -0
- package/dist/esm/parser/fetch-parser.js +15 -0
- package/dist/esm/parser/insert-values-parser.d.ts +3 -3
- package/dist/esm/parser/merge-parser.d.ts +9 -0
- package/dist/esm/parser/merge-parser.js +28 -0
- package/dist/esm/parser/table-parser.d.ts +4 -3
- package/dist/esm/parser/top-parser.d.ts +2 -0
- package/dist/esm/parser/top-parser.js +17 -0
- package/dist/esm/plugin/with-schema/with-schema-transformer.js +4 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +99 -0
- package/dist/esm/query-builder/delete-query-builder.js +120 -0
- package/dist/esm/query-builder/insert-query-builder.d.ts +73 -3
- package/dist/esm/query-builder/insert-query-builder.js +242 -0
- package/dist/esm/query-builder/merge-query-builder.d.ts +557 -0
- package/dist/esm/query-builder/merge-query-builder.js +512 -0
- package/dist/esm/query-builder/merge-result.d.ts +4 -0
- package/dist/esm/query-builder/merge-result.js +7 -0
- package/dist/esm/query-builder/select-query-builder.d.ts +102 -7
- package/dist/esm/query-builder/select-query-builder.js +14 -0
- package/dist/esm/query-builder/update-query-builder.d.ts +82 -3
- package/dist/esm/query-builder/update-query-builder.js +98 -0
- package/dist/esm/query-compiler/default-query-compiler.d.ts +10 -0
- package/dist/esm/query-compiler/default-query-compiler.js +94 -10
- package/dist/esm/query-compiler/query-compiler.d.ts +2 -1
- package/dist/esm/query-creator.d.ts +40 -2
- package/dist/esm/query-creator.js +10 -1
- package/dist/esm/schema/alter-table-add-index-builder.js +7 -3
- package/dist/esm/schema/column-definition-builder.d.ts +13 -1
- package/dist/esm/schema/column-definition-builder.js +15 -1
- package/dist/esm/util/infer-result.d.ts +2 -1
- package/dist/esm/util/type-utils.d.ts +3 -2
- package/package.json +22 -21
|
@@ -12,6 +12,7 @@ import { LimitNode } from '../operation-node/limit-node.js';
|
|
|
12
12
|
import { parseOrderBy, } from '../parser/order-by-parser.js';
|
|
13
13
|
import { parseValueBinaryOperationOrExpression, parseReferentialBinaryOperation, } from '../parser/binary-operation-parser.js';
|
|
14
14
|
import { parseValueExpression, } from '../parser/value-parser.js';
|
|
15
|
+
import { parseTop } from '../parser/top-parser.js';
|
|
15
16
|
export class DeleteQueryBuilder {
|
|
16
17
|
#props;
|
|
17
18
|
constructor(props) {
|
|
@@ -35,6 +36,51 @@ export class DeleteQueryBuilder {
|
|
|
35
36
|
queryNode: QueryNode.cloneWithoutWhere(this.#props.queryNode),
|
|
36
37
|
});
|
|
37
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Changes a `delete from` query into a `delete top from` query.
|
|
41
|
+
*
|
|
42
|
+
* `top` clause is only supported by some dialects like MS SQL Server.
|
|
43
|
+
*
|
|
44
|
+
* ### Examples
|
|
45
|
+
*
|
|
46
|
+
* Delete the first 5 rows:
|
|
47
|
+
*
|
|
48
|
+
* ```ts
|
|
49
|
+
* await db
|
|
50
|
+
* .deleteFrom('person')
|
|
51
|
+
* .top(5)
|
|
52
|
+
* .where('age', '>', 18)
|
|
53
|
+
* .executeTakeFirstOrThrow()
|
|
54
|
+
* ```
|
|
55
|
+
*
|
|
56
|
+
* The generated SQL (MS SQL Server):
|
|
57
|
+
*
|
|
58
|
+
* ```sql
|
|
59
|
+
* delete top(5) from "person" where "age" > @1
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* Delete the first 50% of rows:
|
|
63
|
+
*
|
|
64
|
+
* ```ts
|
|
65
|
+
* await db
|
|
66
|
+
* .deleteFrom('person')
|
|
67
|
+
* .top(50, 'percent')
|
|
68
|
+
* .where('age', '>', 18)
|
|
69
|
+
* .executeTakeFirstOrThrow()
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* The generated SQL (MS SQL Server):
|
|
73
|
+
*
|
|
74
|
+
* ```sql
|
|
75
|
+
* delete top(50) percent from "person" where "age" > @1
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
top(expression, modifiers) {
|
|
79
|
+
return new DeleteQueryBuilder({
|
|
80
|
+
...this.#props,
|
|
81
|
+
queryNode: QueryNode.cloneWithTop(this.#props.queryNode, parseTop(expression, modifiers)),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
38
84
|
using(tables) {
|
|
39
85
|
return new DeleteQueryBuilder({
|
|
40
86
|
...this.#props,
|
|
@@ -77,6 +123,80 @@ export class DeleteQueryBuilder {
|
|
|
77
123
|
queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll(table)),
|
|
78
124
|
});
|
|
79
125
|
}
|
|
126
|
+
/**
|
|
127
|
+
* Clears all `returning` clauses from the query.
|
|
128
|
+
*
|
|
129
|
+
* ### Examples
|
|
130
|
+
*
|
|
131
|
+
* ```ts
|
|
132
|
+
* db.deleteFrom('pet')
|
|
133
|
+
* .returningAll()
|
|
134
|
+
* .where('name', '=', 'Max')
|
|
135
|
+
* .clearReturning()
|
|
136
|
+
* ```
|
|
137
|
+
*
|
|
138
|
+
* The generated SQL(PostgreSQL):
|
|
139
|
+
*
|
|
140
|
+
* ```sql
|
|
141
|
+
* delete from "pet" where "name" = "Max"
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
clearReturning() {
|
|
145
|
+
return new DeleteQueryBuilder({
|
|
146
|
+
...this.#props,
|
|
147
|
+
queryNode: QueryNode.cloneWithoutReturning(this.#props.queryNode),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Clears the `limit` clause from the query.
|
|
152
|
+
*
|
|
153
|
+
* ### Examples
|
|
154
|
+
*
|
|
155
|
+
* ```ts
|
|
156
|
+
* db.deleteFrom('pet')
|
|
157
|
+
* .returningAll()
|
|
158
|
+
* .where('name', '=', 'Max')
|
|
159
|
+
* .limit(5)
|
|
160
|
+
* .clearLimit()
|
|
161
|
+
* ```
|
|
162
|
+
*
|
|
163
|
+
* The generated SQL(PostgreSQL):
|
|
164
|
+
*
|
|
165
|
+
* ```sql
|
|
166
|
+
* delete from "pet" where "name" = "Max" returning *
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
clearLimit() {
|
|
170
|
+
return new DeleteQueryBuilder({
|
|
171
|
+
...this.#props,
|
|
172
|
+
queryNode: DeleteQueryNode.cloneWithoutLimit(this.#props.queryNode),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Clears the `order by` clause from the query.
|
|
177
|
+
*
|
|
178
|
+
* ### Examples
|
|
179
|
+
*
|
|
180
|
+
* ```ts
|
|
181
|
+
* db.deleteFrom('pet')
|
|
182
|
+
* .returningAll()
|
|
183
|
+
* .where('name', '=', 'Max')
|
|
184
|
+
* .orderBy('id')
|
|
185
|
+
* .clearOrderBy()
|
|
186
|
+
* ```
|
|
187
|
+
*
|
|
188
|
+
* The generated SQL(PostgreSQL):
|
|
189
|
+
*
|
|
190
|
+
* ```sql
|
|
191
|
+
* delete from "pet" where "name" = "Max" returning *
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
clearOrderBy() {
|
|
195
|
+
return new DeleteQueryBuilder({
|
|
196
|
+
...this.#props,
|
|
197
|
+
queryNode: DeleteQueryNode.cloneWithoutOrderBy(this.#props.queryNode),
|
|
198
|
+
});
|
|
199
|
+
}
|
|
80
200
|
/**
|
|
81
201
|
* Adds an `order by` clause to the query.
|
|
82
202
|
*
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
2
2
|
import { CompiledQuery } from '../query-compiler/compiled-query.js';
|
|
3
3
|
import { SelectExpression, SelectCallback } from '../parser/select-parser.js';
|
|
4
|
-
import {
|
|
4
|
+
import { InsertExpression } from '../parser/insert-values-parser.js';
|
|
5
5
|
import { InsertQueryNode } from '../operation-node/insert-query-node.js';
|
|
6
6
|
import { QueryNode } from '../operation-node/query-node.js';
|
|
7
7
|
import { NarrowPartial, SimplifyResult, SimplifySingleResult } from '../util/type-utils.js';
|
|
@@ -184,8 +184,7 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
|
|
|
184
184
|
* }))
|
|
185
185
|
* ```
|
|
186
186
|
*/
|
|
187
|
-
values(insert:
|
|
188
|
-
values(insert: InsertObjectOrListFactory<DB, TB>): InsertQueryBuilder<DB, TB, O>;
|
|
187
|
+
values(insert: InsertExpression<DB, TB>): InsertQueryBuilder<DB, TB, O>;
|
|
189
188
|
/**
|
|
190
189
|
* Sets the columns to insert.
|
|
191
190
|
*
|
|
@@ -242,6 +241,14 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
|
|
|
242
241
|
expression(expression: ExpressionOrFactory<DB, TB, any>): InsertQueryBuilder<DB, TB, O>;
|
|
243
242
|
/**
|
|
244
243
|
* Creates an `insert into "person" default values` query.
|
|
244
|
+
*
|
|
245
|
+
* ### Examples
|
|
246
|
+
*
|
|
247
|
+
* ```ts
|
|
248
|
+
* await db.insertInto('person')
|
|
249
|
+
* .defaultValues()
|
|
250
|
+
* .execute()
|
|
251
|
+
* ```
|
|
245
252
|
*/
|
|
246
253
|
defaultValues(): InsertQueryBuilder<DB, TB, O>;
|
|
247
254
|
/**
|
|
@@ -266,6 +273,50 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
|
|
|
266
273
|
* ```
|
|
267
274
|
*/
|
|
268
275
|
ignore(): InsertQueryBuilder<DB, TB, O>;
|
|
276
|
+
/**
|
|
277
|
+
* Changes an `insert into` query to an `insert top into` query.
|
|
278
|
+
*
|
|
279
|
+
* `top` clause is only supported by some dialects like MS SQL Server.
|
|
280
|
+
*
|
|
281
|
+
* ### Examples
|
|
282
|
+
*
|
|
283
|
+
* Insert the first 5 rows:
|
|
284
|
+
*
|
|
285
|
+
* ```ts
|
|
286
|
+
* await db.insertInto('person')
|
|
287
|
+
* .top(5)
|
|
288
|
+
* .columns(['first_name', 'gender'])
|
|
289
|
+
* .expression(
|
|
290
|
+
* (eb) => eb.selectFrom('pet').select(['name', sql.lit('other').as('gender')])
|
|
291
|
+
* )
|
|
292
|
+
* .execute()
|
|
293
|
+
* ```
|
|
294
|
+
*
|
|
295
|
+
* The generated SQL (MS SQL Server):
|
|
296
|
+
*
|
|
297
|
+
* ```sql
|
|
298
|
+
* insert top(5) into "person" ("first_name", "gender") select "name", 'other' as "gender" from "pet"
|
|
299
|
+
* ```
|
|
300
|
+
*
|
|
301
|
+
* Insert the first 50 percent of rows:
|
|
302
|
+
*
|
|
303
|
+
* ```ts
|
|
304
|
+
* await db.insertInto('person')
|
|
305
|
+
* .top(50, 'percent')
|
|
306
|
+
* .columns(['first_name', 'gender'])
|
|
307
|
+
* .expression(
|
|
308
|
+
* (eb) => eb.selectFrom('pet').select(['name', sql.lit('other').as('gender')])
|
|
309
|
+
* )
|
|
310
|
+
* .execute()
|
|
311
|
+
* ```
|
|
312
|
+
*
|
|
313
|
+
* The generated SQL (MS SQL Server):
|
|
314
|
+
*
|
|
315
|
+
* ```sql
|
|
316
|
+
* insert top(50) percent into "person" ("first_name", "gender") select "name", 'other' as "gender" from "pet"
|
|
317
|
+
* ```
|
|
318
|
+
*/
|
|
319
|
+
top(expression: number | bigint, modifiers?: 'percent'): InsertQueryBuilder<DB, TB, O>;
|
|
269
320
|
/**
|
|
270
321
|
* Adds an `on conflict` clause to the query.
|
|
271
322
|
*
|
|
@@ -504,6 +555,25 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
|
|
|
504
555
|
* that support `returning` such as PostgreSQL.
|
|
505
556
|
*/
|
|
506
557
|
returningAll(): InsertQueryBuilder<DB, TB, Selectable<DB[TB]>>;
|
|
558
|
+
/**
|
|
559
|
+
* Clears all `returning` clauses from the query.
|
|
560
|
+
*
|
|
561
|
+
* ### Examples
|
|
562
|
+
*
|
|
563
|
+
* ```ts
|
|
564
|
+
* db.insertInto('person')
|
|
565
|
+
* .values({ first_name: 'James', last_name: 'Smith', age: 42 })
|
|
566
|
+
* .returning(['first_name'])
|
|
567
|
+
* .clearReturning()
|
|
568
|
+
* ```
|
|
569
|
+
*
|
|
570
|
+
* The generated SQL(PostgreSQL):
|
|
571
|
+
*
|
|
572
|
+
* ```sql
|
|
573
|
+
* insert into "person" ("James", "Smith", 42)
|
|
574
|
+
* ```
|
|
575
|
+
*/
|
|
576
|
+
clearReturning(): InsertQueryBuilder<DB, TB, InsertResult>;
|
|
507
577
|
/**
|
|
508
578
|
* Simply calls the provided function passing `this` as the only argument. `$call` returns
|
|
509
579
|
* what the provided function returns.
|
|
@@ -13,11 +13,172 @@ import { parseExpression, } from '../parser/expression-parser.js';
|
|
|
13
13
|
import { ColumnNode } from '../operation-node/column-node.js';
|
|
14
14
|
import { OnConflictBuilder, } from './on-conflict-builder.js';
|
|
15
15
|
import { OnConflictNode } from '../operation-node/on-conflict-node.js';
|
|
16
|
+
import { parseTop } from '../parser/top-parser.js';
|
|
16
17
|
export class InsertQueryBuilder {
|
|
17
18
|
#props;
|
|
18
19
|
constructor(props) {
|
|
19
20
|
this.#props = freeze(props);
|
|
20
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Sets the values to insert for an {@link Kysely.insertInto | insert} query.
|
|
24
|
+
*
|
|
25
|
+
* This method takes an object whose keys are column names and values are
|
|
26
|
+
* values to insert. In addition to the column's type, the values can be
|
|
27
|
+
* raw {@link sql} snippets or select queries.
|
|
28
|
+
*
|
|
29
|
+
* You must provide all fields you haven't explicitly marked as nullable
|
|
30
|
+
* or optional using {@link Generated} or {@link ColumnType}.
|
|
31
|
+
*
|
|
32
|
+
* The return value of an `insert` query is an instance of {@link InsertResult}. The
|
|
33
|
+
* {@link InsertResult.insertId | insertId} field holds the auto incremented primary
|
|
34
|
+
* key if the database returned one.
|
|
35
|
+
*
|
|
36
|
+
* On PostgreSQL and some other dialects, you need to call `returning` to get
|
|
37
|
+
* something out of the query.
|
|
38
|
+
*
|
|
39
|
+
* Also see the {@link expression} method for inserting the result of a select
|
|
40
|
+
* query or any other expression.
|
|
41
|
+
*
|
|
42
|
+
* ### Examples
|
|
43
|
+
*
|
|
44
|
+
* <!-- siteExample("insert", "Single row", 10) -->
|
|
45
|
+
*
|
|
46
|
+
* Insert a single row:
|
|
47
|
+
*
|
|
48
|
+
* ```ts
|
|
49
|
+
* const result = await db
|
|
50
|
+
* .insertInto('person')
|
|
51
|
+
* .values({
|
|
52
|
+
* first_name: 'Jennifer',
|
|
53
|
+
* last_name: 'Aniston',
|
|
54
|
+
* age: 40
|
|
55
|
+
* })
|
|
56
|
+
* .executeTakeFirst()
|
|
57
|
+
*
|
|
58
|
+
* // `insertId` is only available on dialects that
|
|
59
|
+
* // automatically return the id of the inserted row
|
|
60
|
+
* // such as MySQL and SQLite. On PostgreSQL, for example,
|
|
61
|
+
* // you need to add a `returning` clause to the query to
|
|
62
|
+
* // get anything out. See the "returning data" example.
|
|
63
|
+
* console.log(result.insertId)
|
|
64
|
+
* ```
|
|
65
|
+
*
|
|
66
|
+
* The generated SQL (MySQL):
|
|
67
|
+
*
|
|
68
|
+
* ```sql
|
|
69
|
+
* insert into `person` (`first_name`, `last_name`, `age`) values (?, ?, ?)
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* <!-- siteExample("insert", "Multiple rows", 20) -->
|
|
73
|
+
*
|
|
74
|
+
* On dialects that support it (for example PostgreSQL) you can insert multiple
|
|
75
|
+
* rows by providing an array. Note that the return value is once again very
|
|
76
|
+
* dialect-specific. Some databases may only return the id of the *last* inserted
|
|
77
|
+
* row and some return nothing at all unless you call `returning`.
|
|
78
|
+
*
|
|
79
|
+
* ```ts
|
|
80
|
+
* await db
|
|
81
|
+
* .insertInto('person')
|
|
82
|
+
* .values([{
|
|
83
|
+
* first_name: 'Jennifer',
|
|
84
|
+
* last_name: 'Aniston',
|
|
85
|
+
* age: 40,
|
|
86
|
+
* }, {
|
|
87
|
+
* first_name: 'Arnold',
|
|
88
|
+
* last_name: 'Schwarzenegger',
|
|
89
|
+
* age: 70,
|
|
90
|
+
* }])
|
|
91
|
+
* .execute()
|
|
92
|
+
* ```
|
|
93
|
+
*
|
|
94
|
+
* The generated SQL (PostgreSQL):
|
|
95
|
+
*
|
|
96
|
+
* ```sql
|
|
97
|
+
* insert into "person" ("first_name", "last_name", "age") values (($1, $2, $3), ($4, $5, $6))
|
|
98
|
+
* ```
|
|
99
|
+
*
|
|
100
|
+
* <!-- siteExample("insert", "Returning data", 30) -->
|
|
101
|
+
*
|
|
102
|
+
* On supported dialects like PostgreSQL you need to chain `returning` to the query to get
|
|
103
|
+
* the inserted row's columns (or any other expression) as the return value. `returning`
|
|
104
|
+
* works just like `select`. Refer to `select` method's examples and documentation for
|
|
105
|
+
* more info.
|
|
106
|
+
*
|
|
107
|
+
* ```ts
|
|
108
|
+
* const result = await db
|
|
109
|
+
* .insertInto('person')
|
|
110
|
+
* .values({
|
|
111
|
+
* first_name: 'Jennifer',
|
|
112
|
+
* last_name: 'Aniston',
|
|
113
|
+
* age: 40,
|
|
114
|
+
* })
|
|
115
|
+
* .returning(['id', 'first_name as name'])
|
|
116
|
+
* .executeTakeFirstOrThrow()
|
|
117
|
+
* ```
|
|
118
|
+
*
|
|
119
|
+
* The generated SQL (PostgreSQL):
|
|
120
|
+
*
|
|
121
|
+
* ```sql
|
|
122
|
+
* insert into "person" ("first_name", "last_name", "age") values ($1, $2, $3) returning "id", "first_name" as "name"
|
|
123
|
+
* ```
|
|
124
|
+
*
|
|
125
|
+
* <!-- siteExample("insert", "Complex values", 40) -->
|
|
126
|
+
*
|
|
127
|
+
* In addition to primitives, the values can also be arbitrary expressions.
|
|
128
|
+
* You can build the expressions by using a callback and calling the methods
|
|
129
|
+
* on the expression builder passed to it:
|
|
130
|
+
*
|
|
131
|
+
* ```ts
|
|
132
|
+
* import { sql } from 'kysely'
|
|
133
|
+
*
|
|
134
|
+
* const ani = "Ani"
|
|
135
|
+
* const ston = "ston"
|
|
136
|
+
*
|
|
137
|
+
* const result = await db
|
|
138
|
+
* .insertInto('person')
|
|
139
|
+
* .values(({ ref, selectFrom, fn }) => ({
|
|
140
|
+
* first_name: 'Jennifer',
|
|
141
|
+
* last_name: sql`concat(${ani}, ${ston})`,
|
|
142
|
+
* middle_name: ref('first_name'),
|
|
143
|
+
* age: selectFrom('person')
|
|
144
|
+
* .select(fn.avg<number>('age')
|
|
145
|
+
* .as('avg_age')),
|
|
146
|
+
* }))
|
|
147
|
+
* .executeTakeFirst()
|
|
148
|
+
* ```
|
|
149
|
+
*
|
|
150
|
+
* The generated SQL (PostgreSQL):
|
|
151
|
+
*
|
|
152
|
+
* ```sql
|
|
153
|
+
* insert into "person" (
|
|
154
|
+
* "first_name",
|
|
155
|
+
* "last_name",
|
|
156
|
+
* "middle_name",
|
|
157
|
+
* "age"
|
|
158
|
+
* )
|
|
159
|
+
* values (
|
|
160
|
+
* $1,
|
|
161
|
+
* concat($2, $3),
|
|
162
|
+
* "first_name",
|
|
163
|
+
* (select avg("age") as "avg_age" from "person")
|
|
164
|
+
* )
|
|
165
|
+
* ```
|
|
166
|
+
*
|
|
167
|
+
* You can also use the callback version of subqueries or raw expressions:
|
|
168
|
+
*
|
|
169
|
+
* ```ts
|
|
170
|
+
* db.with('jennifer', (db) => db
|
|
171
|
+
* .selectFrom('person')
|
|
172
|
+
* .where('first_name', '=', 'Jennifer')
|
|
173
|
+
* .select(['id', 'first_name', 'gender'])
|
|
174
|
+
* .limit(1)
|
|
175
|
+
* ).insertInto('pet').values((eb) => ({
|
|
176
|
+
* owner_id: eb.selectFrom('jennifer').select('id'),
|
|
177
|
+
* name: eb.selectFrom('jennifer').select('first_name'),
|
|
178
|
+
* species: 'cat',
|
|
179
|
+
* }))
|
|
180
|
+
* ```
|
|
181
|
+
*/
|
|
21
182
|
values(insert) {
|
|
22
183
|
const [columns, values] = parseInsertExpression(insert);
|
|
23
184
|
return new InsertQueryBuilder({
|
|
@@ -98,6 +259,14 @@ export class InsertQueryBuilder {
|
|
|
98
259
|
}
|
|
99
260
|
/**
|
|
100
261
|
* Creates an `insert into "person" default values` query.
|
|
262
|
+
*
|
|
263
|
+
* ### Examples
|
|
264
|
+
*
|
|
265
|
+
* ```ts
|
|
266
|
+
* await db.insertInto('person')
|
|
267
|
+
* .defaultValues()
|
|
268
|
+
* .execute()
|
|
269
|
+
* ```
|
|
101
270
|
*/
|
|
102
271
|
defaultValues() {
|
|
103
272
|
return new InsertQueryBuilder({
|
|
@@ -136,6 +305,55 @@ export class InsertQueryBuilder {
|
|
|
136
305
|
}),
|
|
137
306
|
});
|
|
138
307
|
}
|
|
308
|
+
/**
|
|
309
|
+
* Changes an `insert into` query to an `insert top into` query.
|
|
310
|
+
*
|
|
311
|
+
* `top` clause is only supported by some dialects like MS SQL Server.
|
|
312
|
+
*
|
|
313
|
+
* ### Examples
|
|
314
|
+
*
|
|
315
|
+
* Insert the first 5 rows:
|
|
316
|
+
*
|
|
317
|
+
* ```ts
|
|
318
|
+
* await db.insertInto('person')
|
|
319
|
+
* .top(5)
|
|
320
|
+
* .columns(['first_name', 'gender'])
|
|
321
|
+
* .expression(
|
|
322
|
+
* (eb) => eb.selectFrom('pet').select(['name', sql.lit('other').as('gender')])
|
|
323
|
+
* )
|
|
324
|
+
* .execute()
|
|
325
|
+
* ```
|
|
326
|
+
*
|
|
327
|
+
* The generated SQL (MS SQL Server):
|
|
328
|
+
*
|
|
329
|
+
* ```sql
|
|
330
|
+
* insert top(5) into "person" ("first_name", "gender") select "name", 'other' as "gender" from "pet"
|
|
331
|
+
* ```
|
|
332
|
+
*
|
|
333
|
+
* Insert the first 50 percent of rows:
|
|
334
|
+
*
|
|
335
|
+
* ```ts
|
|
336
|
+
* await db.insertInto('person')
|
|
337
|
+
* .top(50, 'percent')
|
|
338
|
+
* .columns(['first_name', 'gender'])
|
|
339
|
+
* .expression(
|
|
340
|
+
* (eb) => eb.selectFrom('pet').select(['name', sql.lit('other').as('gender')])
|
|
341
|
+
* )
|
|
342
|
+
* .execute()
|
|
343
|
+
* ```
|
|
344
|
+
*
|
|
345
|
+
* The generated SQL (MS SQL Server):
|
|
346
|
+
*
|
|
347
|
+
* ```sql
|
|
348
|
+
* insert top(50) percent into "person" ("first_name", "gender") select "name", 'other' as "gender" from "pet"
|
|
349
|
+
* ```
|
|
350
|
+
*/
|
|
351
|
+
top(expression, modifiers) {
|
|
352
|
+
return new InsertQueryBuilder({
|
|
353
|
+
...this.#props,
|
|
354
|
+
queryNode: QueryNode.cloneWithTop(this.#props.queryNode, parseTop(expression, modifiers)),
|
|
355
|
+
});
|
|
356
|
+
}
|
|
139
357
|
/**
|
|
140
358
|
* Adds an `on conflict` clause to the query.
|
|
141
359
|
*
|
|
@@ -335,6 +553,30 @@ export class InsertQueryBuilder {
|
|
|
335
553
|
queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll()),
|
|
336
554
|
});
|
|
337
555
|
}
|
|
556
|
+
/**
|
|
557
|
+
* Clears all `returning` clauses from the query.
|
|
558
|
+
*
|
|
559
|
+
* ### Examples
|
|
560
|
+
*
|
|
561
|
+
* ```ts
|
|
562
|
+
* db.insertInto('person')
|
|
563
|
+
* .values({ first_name: 'James', last_name: 'Smith', age: 42 })
|
|
564
|
+
* .returning(['first_name'])
|
|
565
|
+
* .clearReturning()
|
|
566
|
+
* ```
|
|
567
|
+
*
|
|
568
|
+
* The generated SQL(PostgreSQL):
|
|
569
|
+
*
|
|
570
|
+
* ```sql
|
|
571
|
+
* insert into "person" ("James", "Smith", 42)
|
|
572
|
+
* ```
|
|
573
|
+
*/
|
|
574
|
+
clearReturning() {
|
|
575
|
+
return new InsertQueryBuilder({
|
|
576
|
+
...this.#props,
|
|
577
|
+
queryNode: QueryNode.cloneWithoutReturning(this.#props.queryNode),
|
|
578
|
+
});
|
|
579
|
+
}
|
|
338
580
|
/**
|
|
339
581
|
* Simply calls the provided function passing `this` as the only argument. `$call` returns
|
|
340
582
|
* what the provided function returns.
|