kysely 0.9.7 → 0.10.1
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 +15 -13
- package/dist/cjs/driver/runtime-driver.js +3 -4
- package/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/operation-node/column-definition-node.d.ts +8 -6
- package/dist/cjs/operation-node/column-definition-node.js +4 -4
- package/dist/cjs/operation-node/create-schema-node.d.ts +1 -2
- package/dist/cjs/operation-node/create-table-node.d.ts +2 -3
- package/dist/cjs/operation-node/create-table-node.js +2 -2
- package/dist/cjs/operation-node/create-view-node.d.ts +22 -0
- package/dist/cjs/operation-node/create-view-node.js +25 -0
- package/dist/cjs/operation-node/default-value-node.d.ts +14 -0
- package/dist/cjs/operation-node/default-value-node.js +18 -0
- package/dist/cjs/operation-node/drop-index-node.d.ts +1 -2
- package/dist/cjs/operation-node/drop-schema-node.d.ts +2 -3
- package/dist/cjs/operation-node/drop-schema-node.js +3 -3
- package/dist/cjs/operation-node/drop-table-node.d.ts +2 -3
- package/dist/cjs/operation-node/drop-table-node.js +2 -2
- package/dist/cjs/operation-node/drop-view-node.d.ts +17 -0
- package/dist/cjs/operation-node/drop-view-node.js +25 -0
- package/dist/cjs/operation-node/generated-always-as-node.d.ts +16 -0
- package/dist/cjs/operation-node/generated-always-as-node.js +25 -0
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +8 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +47 -11
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +8 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +7 -2
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/operator-node.d.ts +1 -1
- package/dist/cjs/operation-node/operator-node.js +5 -0
- package/dist/cjs/operation-node/raw-node.d.ts +1 -1
- package/dist/cjs/operation-node/select-query-node.d.ts +1 -1
- package/dist/cjs/operation-node/select-query-node.js +1 -1
- package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.d.ts +17 -0
- package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.js +22 -0
- package/dist/cjs/plugin/immediate-value.ts/immediate-value-transformer.d.ts +13 -0
- package/dist/cjs/plugin/immediate-value.ts/immediate-value-transformer.js +21 -0
- package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +4 -0
- package/dist/cjs/plugin/with-schema/with-schema-transformer.js +6 -0
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +8 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +59 -11
- package/dist/cjs/query-compiler/query-compiler.d.ts +3 -1
- package/dist/cjs/raw-builder/raw-builder.d.ts +1 -1
- package/dist/cjs/schema/alter-table-builder.d.ts +6 -2
- package/dist/cjs/schema/alter-table-builder.js +28 -4
- package/dist/cjs/schema/column-definition-builder.d.ts +43 -2
- package/dist/cjs/schema/column-definition-builder.js +23 -6
- package/dist/cjs/schema/create-schema-builder.js +1 -1
- package/dist/cjs/schema/create-table-builder.d.ts +7 -8
- package/dist/cjs/schema/create-table-builder.js +8 -9
- package/dist/cjs/schema/create-view-builder.d.ts +24 -0
- package/dist/cjs/schema/create-view-builder.js +73 -0
- package/dist/cjs/schema/drop-index-builder.js +1 -1
- package/dist/cjs/schema/drop-schema-builder.js +3 -1
- package/dist/cjs/schema/drop-table-builder.js +3 -1
- package/dist/cjs/schema/drop-view-builder.d.ts +20 -0
- package/dist/cjs/schema/drop-view-builder.js +39 -0
- package/dist/cjs/schema/schema.d.ts +30 -3
- package/dist/cjs/schema/schema.js +44 -3
- package/dist/cjs/util/performance-now.d.ts +1 -0
- package/dist/cjs/util/performance-now.js +13 -0
- package/dist/esm/driver/runtime-driver.js +3 -4
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/operation-node/column-definition-node.d.ts +8 -6
- package/dist/esm/operation-node/column-definition-node.js +4 -4
- package/dist/esm/operation-node/create-schema-node.d.ts +1 -2
- package/dist/esm/operation-node/create-table-node.d.ts +2 -3
- package/dist/esm/operation-node/create-table-node.js +2 -2
- package/dist/esm/operation-node/create-view-node.d.ts +22 -0
- package/dist/esm/operation-node/create-view-node.js +22 -0
- package/dist/esm/operation-node/default-value-node.d.ts +14 -0
- package/dist/esm/operation-node/default-value-node.js +15 -0
- package/dist/esm/operation-node/drop-index-node.d.ts +1 -2
- package/dist/esm/operation-node/drop-schema-node.d.ts +2 -3
- package/dist/esm/operation-node/drop-schema-node.js +3 -3
- package/dist/esm/operation-node/drop-table-node.d.ts +2 -3
- package/dist/esm/operation-node/drop-table-node.js +2 -2
- package/dist/esm/operation-node/drop-view-node.d.ts +17 -0
- package/dist/esm/operation-node/drop-view-node.js +22 -0
- package/dist/esm/operation-node/generated-always-as-node.d.ts +16 -0
- package/dist/esm/operation-node/generated-always-as-node.js +22 -0
- package/dist/esm/operation-node/operation-node-transformer.d.ts +8 -0
- package/dist/esm/operation-node/operation-node-transformer.js +47 -11
- package/dist/esm/operation-node/operation-node-visitor.d.ts +8 -0
- package/dist/esm/operation-node/operation-node-visitor.js +7 -2
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/operator-node.d.ts +1 -1
- package/dist/esm/operation-node/operator-node.js +5 -0
- package/dist/esm/operation-node/raw-node.d.ts +1 -1
- package/dist/esm/operation-node/select-query-node.d.ts +1 -1
- package/dist/esm/operation-node/select-query-node.js +1 -1
- package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.d.ts +17 -0
- package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.js +18 -0
- package/dist/esm/plugin/immediate-value.ts/immediate-value-transformer.d.ts +13 -0
- package/dist/esm/plugin/immediate-value.ts/immediate-value-transformer.js +17 -0
- package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +4 -0
- package/dist/esm/plugin/with-schema/with-schema-transformer.js +6 -0
- package/dist/esm/query-compiler/default-query-compiler.d.ts +8 -0
- package/dist/esm/query-compiler/default-query-compiler.js +59 -11
- package/dist/esm/query-compiler/query-compiler.d.ts +3 -1
- package/dist/esm/raw-builder/raw-builder.d.ts +1 -1
- package/dist/esm/schema/alter-table-builder.d.ts +6 -2
- package/dist/esm/schema/alter-table-builder.js +28 -4
- package/dist/esm/schema/column-definition-builder.d.ts +43 -2
- package/dist/esm/schema/column-definition-builder.js +23 -6
- package/dist/esm/schema/create-schema-builder.js +1 -1
- package/dist/esm/schema/create-table-builder.d.ts +7 -8
- package/dist/esm/schema/create-table-builder.js +8 -9
- package/dist/esm/schema/create-view-builder.d.ts +24 -0
- package/dist/esm/schema/create-view-builder.js +69 -0
- package/dist/esm/schema/drop-index-builder.js +1 -1
- package/dist/esm/schema/drop-schema-builder.js +3 -1
- package/dist/esm/schema/drop-table-builder.js +3 -1
- package/dist/esm/schema/drop-view-builder.d.ts +20 -0
- package/dist/esm/schema/drop-view-builder.js +35 -0
- package/dist/esm/schema/schema.d.ts +30 -3
- package/dist/esm/schema/schema.js +44 -3
- package/dist/esm/util/performance-now.d.ts +1 -0
- package/dist/esm/util/performance-now.js +9 -0
- package/package.json +3 -3
|
@@ -35,7 +35,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
35
35
|
this.compileDistinctOn(node.distinctOnSelections);
|
|
36
36
|
this.append(' ');
|
|
37
37
|
}
|
|
38
|
-
if (node.
|
|
38
|
+
if (node.distinct) {
|
|
39
39
|
this.append('distinct');
|
|
40
40
|
this.append(' ');
|
|
41
41
|
}
|
|
@@ -287,7 +287,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
287
287
|
}
|
|
288
288
|
visitCreateTable(node) {
|
|
289
289
|
this.append('create table ');
|
|
290
|
-
if (node.
|
|
290
|
+
if (node.ifNotExists) {
|
|
291
291
|
this.append('if not exists ');
|
|
292
292
|
}
|
|
293
293
|
this.visitNode(node.table);
|
|
@@ -299,21 +299,25 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
299
299
|
this.visitNode(node.column);
|
|
300
300
|
this.append(' ');
|
|
301
301
|
this.visitNode(node.dataType);
|
|
302
|
+
if (node.generatedAlwaysAs) {
|
|
303
|
+
this.append(' ');
|
|
304
|
+
this.visitNode(node.generatedAlwaysAs);
|
|
305
|
+
}
|
|
302
306
|
if (node.defaultTo) {
|
|
303
|
-
this.append('
|
|
307
|
+
this.append(' ');
|
|
304
308
|
this.visitNode(node.defaultTo);
|
|
305
309
|
}
|
|
306
|
-
if (!node.
|
|
310
|
+
if (!node.nullable) {
|
|
307
311
|
this.append(' not null');
|
|
308
312
|
}
|
|
309
|
-
if (node.
|
|
313
|
+
if (node.autoIncrement) {
|
|
310
314
|
this.append(' ');
|
|
311
315
|
this.append(this.getAutoIncrement());
|
|
312
316
|
}
|
|
313
|
-
if (node.
|
|
317
|
+
if (node.unique) {
|
|
314
318
|
this.append(' unique');
|
|
315
319
|
}
|
|
316
|
-
if (node.
|
|
320
|
+
if (node.primaryKey) {
|
|
317
321
|
this.append(' primary key');
|
|
318
322
|
}
|
|
319
323
|
if (node.references) {
|
|
@@ -345,7 +349,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
345
349
|
}
|
|
346
350
|
visitDropTable(node) {
|
|
347
351
|
this.append('drop table ');
|
|
348
|
-
if (node.
|
|
352
|
+
if (node.ifExists) {
|
|
349
353
|
this.append('if exists ');
|
|
350
354
|
}
|
|
351
355
|
this.visitNode(node.table);
|
|
@@ -467,7 +471,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
467
471
|
}
|
|
468
472
|
visitDropIndex(node) {
|
|
469
473
|
this.append('drop index ');
|
|
470
|
-
if (node.
|
|
474
|
+
if (node.ifExists) {
|
|
471
475
|
this.append('if exists ');
|
|
472
476
|
}
|
|
473
477
|
this.visitNode(node.name);
|
|
@@ -478,14 +482,14 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
478
482
|
}
|
|
479
483
|
visitCreateSchema(node) {
|
|
480
484
|
this.append('create schema ');
|
|
481
|
-
if (node.
|
|
485
|
+
if (node.ifNotExists) {
|
|
482
486
|
this.append('if not exists ');
|
|
483
487
|
}
|
|
484
488
|
this.visitNode(node.schema);
|
|
485
489
|
}
|
|
486
490
|
visitDropSchema(node) {
|
|
487
491
|
this.append('drop schema ');
|
|
488
|
-
if (node.
|
|
492
|
+
if (node.ifExists) {
|
|
489
493
|
this.append('if exists ');
|
|
490
494
|
}
|
|
491
495
|
this.visitNode(node.schema);
|
|
@@ -644,6 +648,50 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
644
648
|
}
|
|
645
649
|
this.visitNode(node.union);
|
|
646
650
|
}
|
|
651
|
+
visitCreateView(node) {
|
|
652
|
+
this.append('create ');
|
|
653
|
+
if (node.orReplace) {
|
|
654
|
+
this.append('or replace ');
|
|
655
|
+
}
|
|
656
|
+
if (node.materialized) {
|
|
657
|
+
this.append('materialized ');
|
|
658
|
+
}
|
|
659
|
+
this.append('view ');
|
|
660
|
+
this.visitNode(node.name);
|
|
661
|
+
this.append(' ');
|
|
662
|
+
if (node.columns) {
|
|
663
|
+
this.append('(');
|
|
664
|
+
this.compileList(node.columns);
|
|
665
|
+
this.append(') ');
|
|
666
|
+
}
|
|
667
|
+
if (node.as) {
|
|
668
|
+
this.append('as ');
|
|
669
|
+
this.visitNode(node.as);
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
visitDropView(node) {
|
|
673
|
+
this.append('drop ');
|
|
674
|
+
if (node.materialized) {
|
|
675
|
+
this.append('materialized ');
|
|
676
|
+
}
|
|
677
|
+
this.append('view ');
|
|
678
|
+
if (node.ifExists) {
|
|
679
|
+
this.append('if exists ');
|
|
680
|
+
}
|
|
681
|
+
this.visitNode(node.name);
|
|
682
|
+
}
|
|
683
|
+
visitGeneratedAlwaysAs(node) {
|
|
684
|
+
this.append('generated always as (');
|
|
685
|
+
this.visitNode(node.expression);
|
|
686
|
+
this.append(')');
|
|
687
|
+
if (node.stored) {
|
|
688
|
+
this.append(' stored');
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
visitDefaultValue(node) {
|
|
692
|
+
this.append('default ');
|
|
693
|
+
this.visitNode(node.defaultValue);
|
|
694
|
+
}
|
|
647
695
|
append(str) {
|
|
648
696
|
this.#sql += str;
|
|
649
697
|
}
|
|
@@ -2,13 +2,15 @@ import { AlterTableNode } from '../operation-node/alter-table-node.js';
|
|
|
2
2
|
import { CreateIndexNode } from '../operation-node/create-index-node.js';
|
|
3
3
|
import { CreateSchemaNode } from '../operation-node/create-schema-node.js';
|
|
4
4
|
import { CreateTableNode } from '../operation-node/create-table-node.js';
|
|
5
|
+
import { CreateViewNode } from '../operation-node/create-view-node.js';
|
|
5
6
|
import { DropIndexNode } from '../operation-node/drop-index-node.js';
|
|
6
7
|
import { DropSchemaNode } from '../operation-node/drop-schema-node.js';
|
|
7
8
|
import { DropTableNode } from '../operation-node/drop-table-node.js';
|
|
9
|
+
import { DropViewNode } from '../operation-node/drop-view-node.js';
|
|
8
10
|
import { QueryNode } from '../operation-node/query-node.js';
|
|
9
11
|
import { RawNode } from '../operation-node/raw-node.js';
|
|
10
12
|
import { CompiledQuery } from './compiled-query.js';
|
|
11
|
-
export declare type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode |
|
|
13
|
+
export declare type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | CreateSchemaNode | CreateViewNode | DropTableNode | DropIndexNode | DropSchemaNode | DropViewNode | AlterTableNode | RawNode;
|
|
12
14
|
/**
|
|
13
15
|
* a `QueryCompiler` compiles a query expressed as a tree of `OperationNodes` into SQL.
|
|
14
16
|
*/
|
|
@@ -63,7 +63,7 @@ export interface AlterTableExecutorProps extends AlterTableBuilderProps {
|
|
|
63
63
|
export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuilderInterface<AlterTableAddColumnBuilder>, OperationNodeSource, Compilable {
|
|
64
64
|
#private;
|
|
65
65
|
constructor(props: AlterTableAddColumnBuilderProps);
|
|
66
|
-
|
|
66
|
+
autoIncrement(): AlterTableAddColumnBuilder;
|
|
67
67
|
primaryKey(): AlterTableAddColumnBuilder;
|
|
68
68
|
references(ref: string): AlterTableAddColumnBuilder;
|
|
69
69
|
onDelete(onDelete: OnModifyForeignAction): AlterTableAddColumnBuilder;
|
|
@@ -72,6 +72,8 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
|
|
|
72
72
|
notNull(): AlterTableAddColumnBuilder;
|
|
73
73
|
defaultTo(value: PrimitiveValue | AnyRawBuilder): AlterTableAddColumnBuilder;
|
|
74
74
|
check(sql: string): AlterTableAddColumnBuilder;
|
|
75
|
+
generatedAlwaysAs(sql: string): AlterTableAddColumnBuilder;
|
|
76
|
+
stored(): AlterTableAddColumnBuilder;
|
|
75
77
|
toOperationNode(): AlterTableNode;
|
|
76
78
|
compile(): CompiledQuery;
|
|
77
79
|
execute(): Promise<void>;
|
|
@@ -82,7 +84,7 @@ export interface AlterTableAddColumnBuilderProps extends AlterTableBuilderProps
|
|
|
82
84
|
export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBuilderInterface<AlterTableModifyColumnBuilder>, OperationNodeSource, Compilable {
|
|
83
85
|
#private;
|
|
84
86
|
constructor(props: AlterTableModifyColumnBuilderProps);
|
|
85
|
-
|
|
87
|
+
autoIncrement(): AlterTableModifyColumnBuilder;
|
|
86
88
|
primaryKey(): AlterTableModifyColumnBuilder;
|
|
87
89
|
references(ref: string): AlterTableModifyColumnBuilder;
|
|
88
90
|
onDelete(onDelete: OnModifyForeignAction): AlterTableModifyColumnBuilder;
|
|
@@ -91,6 +93,8 @@ export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBu
|
|
|
91
93
|
notNull(): AlterTableModifyColumnBuilder;
|
|
92
94
|
defaultTo(value: PrimitiveValue | AnyRawBuilder): AlterTableModifyColumnBuilder;
|
|
93
95
|
check(sql: string): AlterTableModifyColumnBuilder;
|
|
96
|
+
generatedAlwaysAs(sql: string): AlterTableModifyColumnBuilder;
|
|
97
|
+
stored(): AlterTableModifyColumnBuilder;
|
|
94
98
|
toOperationNode(): AlterTableNode;
|
|
95
99
|
compile(): CompiledQuery;
|
|
96
100
|
execute(): Promise<void>;
|
|
@@ -184,10 +184,10 @@ export class AlterTableAddColumnBuilder {
|
|
|
184
184
|
constructor(props) {
|
|
185
185
|
this.#props = freeze(props);
|
|
186
186
|
}
|
|
187
|
-
|
|
187
|
+
autoIncrement() {
|
|
188
188
|
return new AlterTableAddColumnBuilder({
|
|
189
189
|
...this.#props,
|
|
190
|
-
columnBuilder: this.#props.columnBuilder.
|
|
190
|
+
columnBuilder: this.#props.columnBuilder.autoIncrement(),
|
|
191
191
|
});
|
|
192
192
|
}
|
|
193
193
|
primaryKey() {
|
|
@@ -238,6 +238,18 @@ export class AlterTableAddColumnBuilder {
|
|
|
238
238
|
columnBuilder: this.#props.columnBuilder.check(sql),
|
|
239
239
|
});
|
|
240
240
|
}
|
|
241
|
+
generatedAlwaysAs(sql) {
|
|
242
|
+
return new AlterTableAddColumnBuilder({
|
|
243
|
+
...this.#props,
|
|
244
|
+
columnBuilder: this.#props.columnBuilder.generatedAlwaysAs(sql),
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
stored() {
|
|
248
|
+
return new AlterTableAddColumnBuilder({
|
|
249
|
+
...this.#props,
|
|
250
|
+
columnBuilder: this.#props.columnBuilder.stored(),
|
|
251
|
+
});
|
|
252
|
+
}
|
|
241
253
|
toOperationNode() {
|
|
242
254
|
return this.#props.executor.transformQuery(AlterTableNode.cloneWith(this.#props.alterTableNode, {
|
|
243
255
|
addColumn: AddColumnNode.create(this.#props.columnBuilder.toOperationNode()),
|
|
@@ -255,10 +267,10 @@ export class AlterTableModifyColumnBuilder {
|
|
|
255
267
|
constructor(props) {
|
|
256
268
|
this.#props = freeze(props);
|
|
257
269
|
}
|
|
258
|
-
|
|
270
|
+
autoIncrement() {
|
|
259
271
|
return new AlterTableModifyColumnBuilder({
|
|
260
272
|
...this.#props,
|
|
261
|
-
columnBuilder: this.#props.columnBuilder.
|
|
273
|
+
columnBuilder: this.#props.columnBuilder.autoIncrement(),
|
|
262
274
|
});
|
|
263
275
|
}
|
|
264
276
|
primaryKey() {
|
|
@@ -309,6 +321,18 @@ export class AlterTableModifyColumnBuilder {
|
|
|
309
321
|
columnBuilder: this.#props.columnBuilder.check(sql),
|
|
310
322
|
});
|
|
311
323
|
}
|
|
324
|
+
generatedAlwaysAs(sql) {
|
|
325
|
+
return new AlterTableModifyColumnBuilder({
|
|
326
|
+
...this.#props,
|
|
327
|
+
columnBuilder: this.#props.columnBuilder.generatedAlwaysAs(sql),
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
stored() {
|
|
331
|
+
return new AlterTableModifyColumnBuilder({
|
|
332
|
+
...this.#props,
|
|
333
|
+
columnBuilder: this.#props.columnBuilder.stored(),
|
|
334
|
+
});
|
|
335
|
+
}
|
|
312
336
|
toOperationNode() {
|
|
313
337
|
return this.#props.executor.transformQuery(AlterTableNode.cloneWith(this.#props.alterTableNode, {
|
|
314
338
|
modifyColumn: ModifyColumnNode.create(this.#props.columnBuilder.toOperationNode()),
|
|
@@ -12,7 +12,7 @@ export interface ColumnDefinitionBuilderInterface<R> {
|
|
|
12
12
|
* Some dialects like PostgreSQL don't support this. On PostgreSQL
|
|
13
13
|
* you can use the `serial` or `bigserial` data type instead.
|
|
14
14
|
*/
|
|
15
|
-
|
|
15
|
+
autoIncrement(): R;
|
|
16
16
|
/**
|
|
17
17
|
* Makes the column the primary key.
|
|
18
18
|
*
|
|
@@ -40,10 +40,19 @@ export interface ColumnDefinitionBuilderInterface<R> {
|
|
|
40
40
|
* column definition (like MySQL 5) you need to call the table level
|
|
41
41
|
* {@link TableBuilder.addForeignKeyConstraint} method instead.
|
|
42
42
|
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* col.references('person.id').onDelete('cascade')
|
|
46
|
+
* ```
|
|
43
47
|
*/
|
|
44
48
|
onDelete(onDelete: OnModifyForeignAction): R;
|
|
45
49
|
/**
|
|
46
50
|
* Adds an `on update` constraint for the foreign key column.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* col.references('person.id').onUpdate('cascade')
|
|
55
|
+
* ```
|
|
47
56
|
*/
|
|
48
57
|
onUpdate(onUpdate: OnModifyForeignAction): R;
|
|
49
58
|
/**
|
|
@@ -78,11 +87,41 @@ export interface ColumnDefinitionBuilderInterface<R> {
|
|
|
78
87
|
* ```
|
|
79
88
|
*/
|
|
80
89
|
check(sql: string): R;
|
|
90
|
+
/**
|
|
91
|
+
* Makes the column a generated column using a `generated always as` statement.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* db.schema
|
|
96
|
+
* .createTable('person')
|
|
97
|
+
* .addColumn('full_name', 'varchar(255)',
|
|
98
|
+
* (col) => col.generatedAlwaysAs("concat(first_name, ' ', last_name)")
|
|
99
|
+
* )
|
|
100
|
+
* .execute()
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
generatedAlwaysAs(sql: string): R;
|
|
104
|
+
/**
|
|
105
|
+
* Makes a generated column stored instead of virtual. This method can only
|
|
106
|
+
* be used with {@link generatedAlwaysAs}
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* db.schema
|
|
111
|
+
* .createTable('person')
|
|
112
|
+
* .addColumn('full_name', 'varchar(255)', (col) => col
|
|
113
|
+
* .generatedAlwaysAs("concat(first_name, ' ', last_name)")
|
|
114
|
+
* .stored()
|
|
115
|
+
* )
|
|
116
|
+
* .execute()
|
|
117
|
+
* ```
|
|
118
|
+
*/
|
|
119
|
+
stored(): R;
|
|
81
120
|
}
|
|
82
121
|
export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderInterface<ColumnDefinitionBuilder>, OperationNodeSource {
|
|
83
122
|
#private;
|
|
84
123
|
constructor(node: ColumnDefinitionNode);
|
|
85
|
-
|
|
124
|
+
autoIncrement(): ColumnDefinitionBuilder;
|
|
86
125
|
primaryKey(): ColumnDefinitionBuilder;
|
|
87
126
|
references(ref: string): ColumnDefinitionBuilder;
|
|
88
127
|
onDelete(onDelete: OnModifyForeignAction): ColumnDefinitionBuilder;
|
|
@@ -91,5 +130,7 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
|
|
|
91
130
|
notNull(): ColumnDefinitionBuilder;
|
|
92
131
|
defaultTo(value: DefaultValueExpression): ColumnDefinitionBuilder;
|
|
93
132
|
check(sql: string): ColumnDefinitionBuilder;
|
|
133
|
+
generatedAlwaysAs(sql: string): ColumnDefinitionBuilder;
|
|
134
|
+
stored(): ColumnDefinitionBuilder;
|
|
94
135
|
toOperationNode(): ColumnDefinitionNode;
|
|
95
136
|
}
|
|
@@ -6,16 +6,18 @@ import { parseStringReference } from '../parser/reference-parser.js';
|
|
|
6
6
|
import { preventAwait } from '../util/prevent-await.js';
|
|
7
7
|
import { ColumnDefinitionNode } from '../operation-node/column-definition-node.js';
|
|
8
8
|
import { parseDefaultValueExpression, } from '../parser/default-value-parser.js';
|
|
9
|
+
import { GeneratedAlwaysAsNode } from '../operation-node/generated-always-as-node.js';
|
|
10
|
+
import { DefaultValueNode } from '../operation-node/default-value-node.js';
|
|
9
11
|
export class ColumnDefinitionBuilder {
|
|
10
12
|
#node;
|
|
11
13
|
constructor(node) {
|
|
12
14
|
this.#node = node;
|
|
13
15
|
}
|
|
14
|
-
|
|
15
|
-
return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
|
|
16
|
+
autoIncrement() {
|
|
17
|
+
return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { autoIncrement: true }));
|
|
16
18
|
}
|
|
17
19
|
primaryKey() {
|
|
18
|
-
return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
|
|
20
|
+
return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { primaryKey: true }));
|
|
19
21
|
}
|
|
20
22
|
references(ref) {
|
|
21
23
|
const references = parseStringReference(ref);
|
|
@@ -45,14 +47,14 @@ export class ColumnDefinitionBuilder {
|
|
|
45
47
|
}));
|
|
46
48
|
}
|
|
47
49
|
unique() {
|
|
48
|
-
return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
|
|
50
|
+
return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { unique: true }));
|
|
49
51
|
}
|
|
50
52
|
notNull() {
|
|
51
|
-
return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
|
|
53
|
+
return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { nullable: false }));
|
|
52
54
|
}
|
|
53
55
|
defaultTo(value) {
|
|
54
56
|
return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
|
|
55
|
-
defaultTo: parseDefaultValueExpression(value),
|
|
57
|
+
defaultTo: DefaultValueNode.create(parseDefaultValueExpression(value)),
|
|
56
58
|
}));
|
|
57
59
|
}
|
|
58
60
|
check(sql) {
|
|
@@ -60,6 +62,21 @@ export class ColumnDefinitionBuilder {
|
|
|
60
62
|
check: CheckConstraintNode.create(sql),
|
|
61
63
|
}));
|
|
62
64
|
}
|
|
65
|
+
generatedAlwaysAs(sql) {
|
|
66
|
+
return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
|
|
67
|
+
generatedAlwaysAs: GeneratedAlwaysAsNode.create(sql),
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
stored() {
|
|
71
|
+
if (!this.#node.generatedAlwaysAs) {
|
|
72
|
+
throw new Error('stored() can only be called after generatedAlwaysAs');
|
|
73
|
+
}
|
|
74
|
+
return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
|
|
75
|
+
generatedAlwaysAs: GeneratedAlwaysAsNode.cloneWith(this.#node.generatedAlwaysAs, {
|
|
76
|
+
stored: true,
|
|
77
|
+
}),
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
63
80
|
toOperationNode() {
|
|
64
81
|
return this.#node;
|
|
65
82
|
}
|
|
@@ -9,7 +9,7 @@ export class CreateSchemaBuilder {
|
|
|
9
9
|
ifNotExists() {
|
|
10
10
|
return new CreateSchemaBuilder({
|
|
11
11
|
...this.#props,
|
|
12
|
-
createSchemaNode: CreateSchemaNode.cloneWith(this.#props.createSchemaNode, {
|
|
12
|
+
createSchemaNode: CreateSchemaNode.cloneWith(this.#props.createSchemaNode, { ifNotExists: true }),
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
15
|
toOperationNode() {
|
|
@@ -26,9 +26,9 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
|
|
|
26
26
|
* ```ts
|
|
27
27
|
* await db.schema
|
|
28
28
|
* .createTable('person')
|
|
29
|
-
* .addColumn('id', 'integer', (col) => col.
|
|
30
|
-
* .addColumn('first_name', 'varchar(50), (col) => col.notNull())
|
|
31
|
-
* .addColumn('last_name', 'varchar')
|
|
29
|
+
* .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
|
|
30
|
+
* .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
|
|
31
|
+
* .addColumn('last_name', 'varchar(255)')
|
|
32
32
|
* .addColumn('bank_balance', 'numeric(8, 2)')
|
|
33
33
|
* .addColumn('data', db.raw('customtype'))
|
|
34
34
|
* .addColumn('parent_id', 'integer', (col) =>
|
|
@@ -37,11 +37,10 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
|
|
|
37
37
|
* ```
|
|
38
38
|
*
|
|
39
39
|
* With this method, it's once again good to remember that Kysely just builds the query
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* the next example:
|
|
40
|
+
* and doesn't provide the same API for all databses. For example, some databases like
|
|
41
|
+
* older MySQL don't support `references` statement in the column definition. Instead
|
|
42
|
+
* foreign key constraints need to be defined in at the level of the `create table`
|
|
43
|
+
* query. See the next example:
|
|
45
44
|
*
|
|
46
45
|
* @example
|
|
47
46
|
* ```ts
|
|
@@ -27,7 +27,7 @@ export class CreateTableBuilder {
|
|
|
27
27
|
ifNotExists() {
|
|
28
28
|
return new CreateTableBuilder({
|
|
29
29
|
...this.#props,
|
|
30
|
-
createTableNode: CreateTableNode.
|
|
30
|
+
createTableNode: CreateTableNode.cloneWithIfNotExists(this.#props.createTableNode, true),
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
@@ -37,9 +37,9 @@ export class CreateTableBuilder {
|
|
|
37
37
|
* ```ts
|
|
38
38
|
* await db.schema
|
|
39
39
|
* .createTable('person')
|
|
40
|
-
* .addColumn('id', 'integer', (col) => col.
|
|
41
|
-
* .addColumn('first_name', 'varchar(50), (col) => col.notNull())
|
|
42
|
-
* .addColumn('last_name', 'varchar')
|
|
40
|
+
* .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
|
|
41
|
+
* .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
|
|
42
|
+
* .addColumn('last_name', 'varchar(255)')
|
|
43
43
|
* .addColumn('bank_balance', 'numeric(8, 2)')
|
|
44
44
|
* .addColumn('data', db.raw('customtype'))
|
|
45
45
|
* .addColumn('parent_id', 'integer', (col) =>
|
|
@@ -48,11 +48,10 @@ export class CreateTableBuilder {
|
|
|
48
48
|
* ```
|
|
49
49
|
*
|
|
50
50
|
* With this method, it's once again good to remember that Kysely just builds the query
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* the next example:
|
|
51
|
+
* and doesn't provide the same API for all databses. For example, some databases like
|
|
52
|
+
* older MySQL don't support `references` statement in the column definition. Instead
|
|
53
|
+
* foreign key constraints need to be defined in at the level of the `create table`
|
|
54
|
+
* query. See the next example:
|
|
56
55
|
*
|
|
57
56
|
* @example
|
|
58
57
|
* ```ts
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { OperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
2
|
+
import { CompiledQuery } from '../query-compiler/compiled-query.js';
|
|
3
|
+
import { Compilable } from '../util/compilable.js';
|
|
4
|
+
import { QueryExecutor } from '../query-executor/query-executor.js';
|
|
5
|
+
import { QueryId } from '../util/query-id.js';
|
|
6
|
+
import { CreateViewNode } from '../operation-node/create-view-node.js';
|
|
7
|
+
import { AnyQueryBuilder } from '../index.js';
|
|
8
|
+
import { AnyRawBuilder } from '../util/type-utils.js';
|
|
9
|
+
export declare class CreateViewBuilder implements OperationNodeSource, Compilable {
|
|
10
|
+
#private;
|
|
11
|
+
constructor(props: CreateViewBuilderProps);
|
|
12
|
+
materialized(): CreateViewBuilder;
|
|
13
|
+
orReplace(): CreateViewBuilder;
|
|
14
|
+
columns(columns: string[]): CreateViewBuilder;
|
|
15
|
+
as(query: AnyQueryBuilder | AnyRawBuilder): CreateViewBuilder;
|
|
16
|
+
toOperationNode(): CreateViewNode;
|
|
17
|
+
compile(): CompiledQuery;
|
|
18
|
+
execute(): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export interface CreateViewBuilderProps {
|
|
21
|
+
readonly queryId: QueryId;
|
|
22
|
+
readonly executor: QueryExecutor;
|
|
23
|
+
readonly createViewNode: CreateViewNode;
|
|
24
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { preventAwait } from '../util/prevent-await.js';
|
|
2
|
+
import { freeze } from '../util/object-utils.js';
|
|
3
|
+
import { CreateViewNode } from '../operation-node/create-view-node.js';
|
|
4
|
+
import { parseColumnName } from '../parser/reference-parser.js';
|
|
5
|
+
import { QueryNode } from '../index.js';
|
|
6
|
+
import { ImmediateValuePlugin } from '../plugin/immediate-value.ts/immediate-value-plugin.js';
|
|
7
|
+
export class CreateViewBuilder {
|
|
8
|
+
#props;
|
|
9
|
+
constructor(props) {
|
|
10
|
+
this.#props = freeze({
|
|
11
|
+
...props,
|
|
12
|
+
// The select statement (defined using the `as` method) can't have parameters on some
|
|
13
|
+
// dialects. We add the `ImmediateValuePlugin` to make all parameters "immediate"
|
|
14
|
+
// meaning they are interpolated into the SQL instead of added as parameters.
|
|
15
|
+
//
|
|
16
|
+
// The values are therefore not escaped at all, which leads to SQL injection
|
|
17
|
+
// vulnerabilities if user input is passed into the query. However, the use
|
|
18
|
+
// case where user input is passed into a `create view` statement is a weird
|
|
19
|
+
// one, and we can pretty safely just ignore it.
|
|
20
|
+
executor: props.executor.withPlugin(new ImmediateValuePlugin()),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
materialized() {
|
|
24
|
+
return new CreateViewBuilder({
|
|
25
|
+
...this.#props,
|
|
26
|
+
createViewNode: CreateViewNode.cloneWith(this.#props.createViewNode, {
|
|
27
|
+
materialized: true,
|
|
28
|
+
}),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
orReplace() {
|
|
32
|
+
return new CreateViewBuilder({
|
|
33
|
+
...this.#props,
|
|
34
|
+
createViewNode: CreateViewNode.cloneWith(this.#props.createViewNode, {
|
|
35
|
+
orReplace: true,
|
|
36
|
+
}),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
columns(columns) {
|
|
40
|
+
return new CreateViewBuilder({
|
|
41
|
+
...this.#props,
|
|
42
|
+
createViewNode: CreateViewNode.cloneWith(this.#props.createViewNode, {
|
|
43
|
+
columns: columns.map(parseColumnName),
|
|
44
|
+
}),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
as(query) {
|
|
48
|
+
const queryNode = query.toOperationNode();
|
|
49
|
+
if (QueryNode.isMutating(queryNode)) {
|
|
50
|
+
throw new Error('only select statements are allowd in views');
|
|
51
|
+
}
|
|
52
|
+
return new CreateViewBuilder({
|
|
53
|
+
...this.#props,
|
|
54
|
+
createViewNode: CreateViewNode.cloneWith(this.#props.createViewNode, {
|
|
55
|
+
as: queryNode,
|
|
56
|
+
}),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
toOperationNode() {
|
|
60
|
+
return this.#props.executor.transformQuery(this.#props.createViewNode, this.#props.queryId);
|
|
61
|
+
}
|
|
62
|
+
compile() {
|
|
63
|
+
return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
|
|
64
|
+
}
|
|
65
|
+
async execute() {
|
|
66
|
+
await this.#props.executor.executeQuery(this.compile(), this.#props.queryId);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
preventAwait(CreateViewBuilder, "don't await CreateViewBuilder instances directly. To execute the query you need to call `execute`");
|
|
@@ -9,7 +9,9 @@ export class DropSchemaBuilder {
|
|
|
9
9
|
ifExists() {
|
|
10
10
|
return new DropSchemaBuilder({
|
|
11
11
|
...this.#props,
|
|
12
|
-
dropSchemaNode: DropSchemaNode.
|
|
12
|
+
dropSchemaNode: DropSchemaNode.cloneWith(this.#props.dropSchemaNode, {
|
|
13
|
+
ifExists: true,
|
|
14
|
+
}),
|
|
13
15
|
});
|
|
14
16
|
}
|
|
15
17
|
toOperationNode() {
|
|
@@ -9,7 +9,9 @@ export class DropTableBuilder {
|
|
|
9
9
|
ifExists() {
|
|
10
10
|
return new DropTableBuilder({
|
|
11
11
|
...this.#props,
|
|
12
|
-
dropTableNode: DropTableNode.
|
|
12
|
+
dropTableNode: DropTableNode.cloneWith(this.#props.dropTableNode, {
|
|
13
|
+
ifExists: true,
|
|
14
|
+
}),
|
|
13
15
|
});
|
|
14
16
|
}
|
|
15
17
|
toOperationNode() {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { OperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
2
|
+
import { CompiledQuery } from '../query-compiler/compiled-query.js';
|
|
3
|
+
import { Compilable } from '../util/compilable.js';
|
|
4
|
+
import { QueryExecutor } from '../query-executor/query-executor.js';
|
|
5
|
+
import { QueryId } from '../util/query-id.js';
|
|
6
|
+
import { DropViewNode } from '../operation-node/drop-view-node.js';
|
|
7
|
+
export declare class DropViewBuilder implements OperationNodeSource, Compilable {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(props: DropViewBuilderProps);
|
|
10
|
+
materialized(): DropViewBuilder;
|
|
11
|
+
ifExists(): DropViewBuilder;
|
|
12
|
+
toOperationNode(): DropViewNode;
|
|
13
|
+
compile(): CompiledQuery;
|
|
14
|
+
execute(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export interface DropViewBuilderProps {
|
|
17
|
+
readonly queryId: QueryId;
|
|
18
|
+
readonly executor: QueryExecutor;
|
|
19
|
+
readonly dropViewNode: DropViewNode;
|
|
20
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { preventAwait } from '../util/prevent-await.js';
|
|
2
|
+
import { freeze } from '../util/object-utils.js';
|
|
3
|
+
import { DropViewNode } from '../operation-node/drop-view-node.js';
|
|
4
|
+
export class DropViewBuilder {
|
|
5
|
+
#props;
|
|
6
|
+
constructor(props) {
|
|
7
|
+
this.#props = freeze(props);
|
|
8
|
+
}
|
|
9
|
+
materialized() {
|
|
10
|
+
return new DropViewBuilder({
|
|
11
|
+
...this.#props,
|
|
12
|
+
dropViewNode: DropViewNode.cloneWith(this.#props.dropViewNode, {
|
|
13
|
+
materialized: true,
|
|
14
|
+
}),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
ifExists() {
|
|
18
|
+
return new DropViewBuilder({
|
|
19
|
+
...this.#props,
|
|
20
|
+
dropViewNode: DropViewNode.cloneWith(this.#props.dropViewNode, {
|
|
21
|
+
ifExists: true,
|
|
22
|
+
}),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
toOperationNode() {
|
|
26
|
+
return this.#props.executor.transformQuery(this.#props.dropViewNode, this.#props.queryId);
|
|
27
|
+
}
|
|
28
|
+
compile() {
|
|
29
|
+
return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
|
|
30
|
+
}
|
|
31
|
+
async execute() {
|
|
32
|
+
await this.#props.executor.executeQuery(this.compile(), this.#props.queryId);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
preventAwait(DropViewBuilder, "don't await DropViewBuilder instances directly. To execute the query you need to call `execute`");
|