kysely 0.19.8 → 0.19.11
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 +67 -13
- package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +10 -0
- package/dist/cjs/dialect/mysql/mysql-driver.d.ts +1 -0
- package/dist/cjs/dialect/mysql/mysql-driver.js +25 -0
- package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +29 -0
- package/dist/cjs/dialect/postgres/postgres-driver.d.ts +6 -2
- package/dist/cjs/dialect/postgres/postgres-driver.js +24 -2
- package/dist/cjs/dialect/sqlite/sqlite-driver.js +3 -0
- package/dist/cjs/driver/database-connection.d.ts +1 -0
- package/dist/cjs/driver/dummy-driver.js +3 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +4 -0
- package/dist/cjs/operation-node/create-type-node.d.ts +17 -0
- package/dist/cjs/operation-node/create-type-node.js +27 -0
- package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
- package/dist/cjs/operation-node/drop-type-node.d.ts +16 -0
- package/dist/cjs/operation-node/drop-type-node.js +25 -0
- package/dist/cjs/operation-node/insert-query-node.d.ts +2 -1
- package/dist/cjs/operation-node/insert-query-node.js +2 -1
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +9 -2
- package/dist/cjs/operation-node/operation-node-transformer.js +148 -122
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +6 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +3 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/select-modifier-node.d.ts +16 -0
- package/dist/cjs/operation-node/select-modifier-node.js +24 -0
- package/dist/cjs/operation-node/select-query-node.d.ts +5 -5
- package/dist/cjs/operation-node/select-query-node.js +11 -9
- 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-builder/insert-query-builder.d.ts +1 -1
- package/dist/cjs/query-builder/select-query-builder.d.ts +77 -6
- package/dist/cjs/query-builder/select-query-builder.js +101 -14
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +6 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +30 -8
- package/dist/cjs/query-compiler/query-compiler.d.ts +3 -1
- package/dist/cjs/query-creator.d.ts +27 -0
- package/dist/cjs/query-creator.js +33 -0
- package/dist/cjs/query-executor/query-executor-base.d.ts +6 -0
- package/dist/cjs/query-executor/query-executor-base.js +19 -0
- package/dist/cjs/query-executor/query-executor.d.ts +11 -0
- package/dist/cjs/schema/create-table-builder.d.ts +6 -6
- package/dist/cjs/schema/create-table-builder.js +6 -6
- package/dist/cjs/schema/create-type-builder.d.ts +28 -0
- package/dist/cjs/schema/create-type-builder.js +38 -0
- package/dist/cjs/schema/drop-type-builder.d.ts +19 -0
- package/dist/cjs/schema/drop-type-builder.js +31 -0
- package/dist/cjs/schema/schema.d.ts +32 -0
- package/dist/cjs/schema/schema.js +46 -0
- package/dist/cjs/util/deferred.d.ts +7 -0
- package/dist/cjs/util/deferred.js +28 -0
- package/dist/cjs/util/require-all-props.d.ts +43 -0
- package/dist/cjs/util/require-all-props.js +40 -0
- package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +10 -0
- package/dist/esm/dialect/mysql/mysql-driver.d.ts +1 -0
- package/dist/esm/dialect/mysql/mysql-driver.js +25 -0
- package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +29 -0
- package/dist/esm/dialect/postgres/postgres-driver.d.ts +6 -2
- package/dist/esm/dialect/postgres/postgres-driver.js +24 -2
- package/dist/esm/dialect/sqlite/sqlite-driver.js +3 -0
- package/dist/esm/driver/database-connection.d.ts +1 -0
- package/dist/esm/driver/dummy-driver.js +3 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/operation-node/create-type-node.d.ts +17 -0
- package/dist/esm/operation-node/create-type-node.js +25 -0
- package/dist/esm/operation-node/data-type-node.d.ts +1 -1
- package/dist/esm/operation-node/drop-type-node.d.ts +16 -0
- package/dist/esm/operation-node/drop-type-node.js +23 -0
- package/dist/esm/operation-node/insert-query-node.d.ts +2 -1
- package/dist/esm/operation-node/insert-query-node.js +2 -1
- package/dist/esm/operation-node/operation-node-transformer.d.ts +9 -2
- package/dist/esm/operation-node/operation-node-transformer.js +148 -122
- package/dist/esm/operation-node/operation-node-visitor.d.ts +6 -0
- package/dist/esm/operation-node/operation-node-visitor.js +3 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/select-modifier-node.d.ts +16 -0
- package/dist/esm/operation-node/select-modifier-node.js +22 -0
- package/dist/esm/operation-node/select-query-node.d.ts +5 -5
- package/dist/esm/operation-node/select-query-node.js +11 -9
- 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-builder/insert-query-builder.d.ts +1 -1
- package/dist/esm/query-builder/select-query-builder.d.ts +77 -6
- package/dist/esm/query-builder/select-query-builder.js +101 -14
- package/dist/esm/query-compiler/default-query-compiler.d.ts +6 -0
- package/dist/esm/query-compiler/default-query-compiler.js +30 -8
- package/dist/esm/query-compiler/query-compiler.d.ts +3 -1
- package/dist/esm/query-creator.d.ts +27 -0
- package/dist/esm/query-creator.js +33 -0
- package/dist/esm/query-executor/query-executor-base.d.ts +6 -0
- package/dist/esm/query-executor/query-executor-base.js +19 -0
- package/dist/esm/query-executor/query-executor.d.ts +11 -0
- package/dist/esm/schema/create-table-builder.d.ts +6 -6
- package/dist/esm/schema/create-table-builder.js +6 -6
- package/dist/esm/schema/create-type-builder.d.ts +28 -0
- package/dist/esm/schema/create-type-builder.js +35 -0
- package/dist/esm/schema/drop-type-builder.d.ts +19 -0
- package/dist/esm/schema/drop-type-builder.js +28 -0
- package/dist/esm/schema/schema.d.ts +32 -0
- package/dist/esm/schema/schema.js +46 -0
- package/dist/esm/util/deferred.d.ts +7 -0
- package/dist/esm/util/deferred.js +25 -0
- package/dist/esm/util/require-all-props.d.ts +43 -0
- package/dist/esm/util/require-all-props.js +37 -0
- package/package.json +5 -2
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/// <reference types="./select-modifier-node.d.ts" />
|
|
2
|
+
import { freeze } from '../util/object-utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export const SelectModifierNode = freeze({
|
|
7
|
+
is(node) {
|
|
8
|
+
return node.kind === 'SelectModifierNode';
|
|
9
|
+
},
|
|
10
|
+
create(modifier) {
|
|
11
|
+
return freeze({
|
|
12
|
+
kind: 'SelectModifierNode',
|
|
13
|
+
modifier,
|
|
14
|
+
});
|
|
15
|
+
},
|
|
16
|
+
createWithRaw(modifier) {
|
|
17
|
+
return freeze({
|
|
18
|
+
kind: 'SelectModifierNode',
|
|
19
|
+
rawModifier: modifier,
|
|
20
|
+
});
|
|
21
|
+
},
|
|
22
|
+
});
|
|
@@ -13,18 +13,18 @@ import { SelectionNode } from './selection-node.js';
|
|
|
13
13
|
import { WhereNode } from './where-node.js';
|
|
14
14
|
import { WithNode } from './with-node.js';
|
|
15
15
|
import { UnionNode } from './union-node.js';
|
|
16
|
-
|
|
16
|
+
import { SelectModifierNode } from './select-modifier-node.js';
|
|
17
17
|
export interface SelectQueryNode extends OperationNode {
|
|
18
18
|
readonly kind: 'SelectQueryNode';
|
|
19
19
|
readonly from: FromNode;
|
|
20
20
|
readonly selections?: ReadonlyArray<SelectionNode>;
|
|
21
21
|
readonly distinctOnSelections?: ReadonlyArray<SelectionNode>;
|
|
22
|
-
readonly distinct?: boolean;
|
|
23
22
|
readonly joins?: ReadonlyArray<JoinNode>;
|
|
24
23
|
readonly groupBy?: GroupByNode;
|
|
25
24
|
readonly orderBy?: OrderByNode;
|
|
26
25
|
readonly where?: WhereNode;
|
|
27
|
-
readonly
|
|
26
|
+
readonly frontModifiers?: ReadonlyArray<SelectModifierNode>;
|
|
27
|
+
readonly endModifiers?: ReadonlyArray<SelectModifierNode>;
|
|
28
28
|
readonly limit?: LimitNode;
|
|
29
29
|
readonly offset?: OffsetNode;
|
|
30
30
|
readonly with?: WithNode;
|
|
@@ -39,13 +39,13 @@ export declare const SelectQueryNode: Readonly<{
|
|
|
39
39
|
create(fromItems: ReadonlyArray<TableExpressionNode>, withNode?: WithNode): SelectQueryNode;
|
|
40
40
|
cloneWithSelections(select: SelectQueryNode, selections: ReadonlyArray<SelectionNode>): SelectQueryNode;
|
|
41
41
|
cloneWithDistinctOnSelections(select: SelectQueryNode, selections: ReadonlyArray<SelectionNode>): SelectQueryNode;
|
|
42
|
-
|
|
42
|
+
cloneWithFrontModifier(select: SelectQueryNode, modifier: SelectModifierNode): SelectQueryNode;
|
|
43
|
+
cloneWithEndModifier(select: SelectQueryNode, modifier: SelectModifierNode): SelectQueryNode;
|
|
43
44
|
cloneWithOrderByItem(selectNode: SelectQueryNode, item: OrderByItemNode): SelectQueryNode;
|
|
44
45
|
cloneWithGroupByItems(selectNode: SelectQueryNode, items: ReadonlyArray<GroupByItemNode>): SelectQueryNode;
|
|
45
46
|
cloneWithLimit(selectNode: SelectQueryNode, limit: LimitNode): SelectQueryNode;
|
|
46
47
|
cloneWithOffset(selectNode: SelectQueryNode, offset: OffsetNode): SelectQueryNode;
|
|
47
48
|
cloneWithHaving(selectNode: SelectQueryNode, filter: FilterExpressionNode): SelectQueryNode;
|
|
48
49
|
cloneWithOrHaving(selectNode: SelectQueryNode, filter: FilterExpressionNode): SelectQueryNode;
|
|
49
|
-
cloneWithDistinct(selectNode: SelectQueryNode): SelectQueryNode;
|
|
50
50
|
cloneWithUnion(selectNode: SelectQueryNode, union: UnionNode): SelectQueryNode;
|
|
51
51
|
}>;
|
|
@@ -34,11 +34,19 @@ export const SelectQueryNode = freeze({
|
|
|
34
34
|
: freeze(selections),
|
|
35
35
|
});
|
|
36
36
|
},
|
|
37
|
-
|
|
37
|
+
cloneWithFrontModifier(select, modifier) {
|
|
38
38
|
return freeze({
|
|
39
39
|
...select,
|
|
40
|
-
|
|
41
|
-
? freeze([...select.
|
|
40
|
+
frontModifiers: select.frontModifiers
|
|
41
|
+
? freeze([...select.frontModifiers, modifier])
|
|
42
|
+
: freeze([modifier]),
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
cloneWithEndModifier(select, modifier) {
|
|
46
|
+
return freeze({
|
|
47
|
+
...select,
|
|
48
|
+
endModifiers: select.endModifiers
|
|
49
|
+
? freeze([...select.endModifiers, modifier])
|
|
42
50
|
: freeze([modifier]),
|
|
43
51
|
});
|
|
44
52
|
},
|
|
@@ -86,12 +94,6 @@ export const SelectQueryNode = freeze({
|
|
|
86
94
|
: HavingNode.create(filter),
|
|
87
95
|
});
|
|
88
96
|
},
|
|
89
|
-
cloneWithDistinct(selectNode) {
|
|
90
|
-
return freeze({
|
|
91
|
-
...selectNode,
|
|
92
|
-
distinct: true,
|
|
93
|
-
});
|
|
94
|
-
},
|
|
95
97
|
cloneWithUnion(selectNode, union) {
|
|
96
98
|
return freeze({
|
|
97
99
|
...selectNode,
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { AlterTableNode } from '../../operation-node/alter-table-node.js';
|
|
2
2
|
import { CreateIndexNode } from '../../operation-node/create-index-node.js';
|
|
3
3
|
import { CreateTableNode } from '../../operation-node/create-table-node.js';
|
|
4
|
+
import { CreateTypeNode } from '../../operation-node/create-type-node.js';
|
|
4
5
|
import { CreateViewNode } from '../../operation-node/create-view-node.js';
|
|
5
6
|
import { DeleteQueryNode } from '../../operation-node/delete-query-node.js';
|
|
6
7
|
import { DropIndexNode } from '../../operation-node/drop-index-node.js';
|
|
7
8
|
import { DropTableNode } from '../../operation-node/drop-table-node.js';
|
|
9
|
+
import { DropTypeNode } from '../../operation-node/drop-type-node.js';
|
|
8
10
|
import { DropViewNode } from '../../operation-node/drop-view-node.js';
|
|
9
11
|
import { InsertQueryNode } from '../../operation-node/insert-query-node.js';
|
|
10
12
|
import { OperationNodeTransformer } from '../../operation-node/operation-node-transformer.js';
|
|
@@ -24,6 +26,8 @@ export declare class WithSchemaTransformer extends OperationNodeTransformer {
|
|
|
24
26
|
protected transformDropIndex(node: DropIndexNode): DropIndexNode;
|
|
25
27
|
protected transformCreateView(node: CreateViewNode): CreateViewNode;
|
|
26
28
|
protected transformDropView(node: DropViewNode): DropViewNode;
|
|
29
|
+
protected transformCreateType(node: CreateTypeNode): CreateTypeNode;
|
|
30
|
+
protected transformDropType(node: DropTypeNode): DropTypeNode;
|
|
27
31
|
protected transformAlterTable(node: AlterTableNode): AlterTableNode;
|
|
28
32
|
protected transformTable(node: TableNode): TableNode;
|
|
29
33
|
}
|
|
@@ -39,6 +39,12 @@ export class WithSchemaTransformer extends OperationNodeTransformer {
|
|
|
39
39
|
transformDropView(node) {
|
|
40
40
|
return this.#transformRoot(node, (node) => super.transformDropView(node));
|
|
41
41
|
}
|
|
42
|
+
transformCreateType(node) {
|
|
43
|
+
return this.#transformRoot(node, (node) => super.transformCreateType(node));
|
|
44
|
+
}
|
|
45
|
+
transformDropType(node) {
|
|
46
|
+
return this.#transformRoot(node, (node) => super.transformDropType(node));
|
|
47
|
+
}
|
|
42
48
|
transformAlterTable(node) {
|
|
43
49
|
return this.#transformRoot(node, (node) => super.transformAlterTable(node));
|
|
44
50
|
}
|
|
@@ -653,6 +653,50 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
653
653
|
*/
|
|
654
654
|
distinctOn<SE extends SelectExpression<DB, TB>>(selections: ReadonlyArray<SE>): SelectQueryBuilder<DB, TB, O>;
|
|
655
655
|
distinctOn<SE extends SelectExpression<DB, TB>>(selection: SE): SelectQueryBuilder<DB, TB, O>;
|
|
656
|
+
/**
|
|
657
|
+
* This can be used to add any additional SQL to the front of the query __after__ the `select` keyword.
|
|
658
|
+
*
|
|
659
|
+
* ### Examples
|
|
660
|
+
*
|
|
661
|
+
* ```ts
|
|
662
|
+
* db.selectFrom('person')
|
|
663
|
+
* .modifyFront(sql`sql_no_cache`)
|
|
664
|
+
* .select('first_name')
|
|
665
|
+
* .execute()
|
|
666
|
+
* ```
|
|
667
|
+
*
|
|
668
|
+
* The generated SQL (MySQL):
|
|
669
|
+
*
|
|
670
|
+
* ```sql
|
|
671
|
+
* select sql_no_cache `first_name`
|
|
672
|
+
* from `person`
|
|
673
|
+
* ```
|
|
674
|
+
*/
|
|
675
|
+
modifyFront(modifier: AnyRawBuilder): SelectQueryBuilder<DB, TB, O>;
|
|
676
|
+
/**
|
|
677
|
+
* This can be used to add any additional SQL to the end of the query.
|
|
678
|
+
*
|
|
679
|
+
* Also see {@link forUpdate}, {@link forShare}, {@link forKeyShare}, {@link forNoKeyUpdate}
|
|
680
|
+
* {@link skipLocked} and {@link noWait}.
|
|
681
|
+
*
|
|
682
|
+
* ### Examples
|
|
683
|
+
*
|
|
684
|
+
* ```ts
|
|
685
|
+
* db.selectFrom('person')
|
|
686
|
+
* .select('first_name')
|
|
687
|
+
* .modifyEnd(sql`for update`)
|
|
688
|
+
* .execute()
|
|
689
|
+
* ```
|
|
690
|
+
*
|
|
691
|
+
* The generated SQL (PostgreSQL):
|
|
692
|
+
*
|
|
693
|
+
* ```sql
|
|
694
|
+
* select "first_name"
|
|
695
|
+
* from "person"
|
|
696
|
+
* for update
|
|
697
|
+
* ```
|
|
698
|
+
*/
|
|
699
|
+
modifyEnd(modifier: AnyRawBuilder): SelectQueryBuilder<DB, TB, O>;
|
|
656
700
|
/**
|
|
657
701
|
* Makes the selection distinct.
|
|
658
702
|
*
|
|
@@ -673,27 +717,27 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
673
717
|
*/
|
|
674
718
|
distinct(): SelectQueryBuilder<DB, TB, O>;
|
|
675
719
|
/**
|
|
676
|
-
* Adds the `for update`
|
|
720
|
+
* Adds the `for update` modifier to a select query on supported databases.
|
|
677
721
|
*/
|
|
678
722
|
forUpdate(): SelectQueryBuilder<DB, TB, O>;
|
|
679
723
|
/**
|
|
680
|
-
* Adds the `for share`
|
|
724
|
+
* Adds the `for share` modifier to a select query on supported databases.
|
|
681
725
|
*/
|
|
682
726
|
forShare(): SelectQueryBuilder<DB, TB, O>;
|
|
683
727
|
/**
|
|
684
|
-
* Adds the `for key share`
|
|
728
|
+
* Adds the `for key share` modifier to a select query on supported databases.
|
|
685
729
|
*/
|
|
686
730
|
forKeyShare(): SelectQueryBuilder<DB, TB, O>;
|
|
687
731
|
/**
|
|
688
|
-
* Adds the `for no key update`
|
|
732
|
+
* Adds the `for no key update` modifier to a select query on supported databases.
|
|
689
733
|
*/
|
|
690
734
|
forNoKeyUpdate(): SelectQueryBuilder<DB, TB, O>;
|
|
691
735
|
/**
|
|
692
|
-
* Adds the `skip locked`
|
|
736
|
+
* Adds the `skip locked` modifier to a select query on supported databases.
|
|
693
737
|
*/
|
|
694
738
|
skipLocked(): SelectQueryBuilder<DB, TB, O>;
|
|
695
739
|
/**
|
|
696
|
-
* Adds the `nowait`
|
|
740
|
+
* Adds the `nowait` modifier to a select query on supported databases.
|
|
697
741
|
*/
|
|
698
742
|
noWait(): SelectQueryBuilder<DB, TB, O>;
|
|
699
743
|
/**
|
|
@@ -1299,6 +1343,33 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
|
|
|
1299
1343
|
* error.
|
|
1300
1344
|
*/
|
|
1301
1345
|
executeTakeFirstOrThrow(errorConstructor?: NoResultErrorConstructor): Promise<O>;
|
|
1346
|
+
/**
|
|
1347
|
+
* Executes the query and streams the rows.
|
|
1348
|
+
*
|
|
1349
|
+
* The optional argument `chunkSize` defines how many rows to fetch from the database
|
|
1350
|
+
* at a time. It only affects some dialects like PostgreSQL that support it.
|
|
1351
|
+
*
|
|
1352
|
+
* ### Examples
|
|
1353
|
+
*
|
|
1354
|
+
* ```ts
|
|
1355
|
+
* const stream = db.
|
|
1356
|
+
* .selectFrom('person')
|
|
1357
|
+
* .select(['first_name', 'last_name'])
|
|
1358
|
+
* .where('gender', '=', 'other')
|
|
1359
|
+
* .stream()
|
|
1360
|
+
*
|
|
1361
|
+
* for await (const person of stream) {
|
|
1362
|
+
* console.log(person.first_name)
|
|
1363
|
+
*
|
|
1364
|
+
* if (person.last_name === 'Something') {
|
|
1365
|
+
* // Breaking or returning before the stream has ended will release
|
|
1366
|
+
* // the database connection and invalidate the stream.
|
|
1367
|
+
* break
|
|
1368
|
+
* }
|
|
1369
|
+
* }
|
|
1370
|
+
* ```
|
|
1371
|
+
*/
|
|
1372
|
+
stream(chunkSize?: number): AsyncIterableIterator<O>;
|
|
1302
1373
|
}
|
|
1303
1374
|
export interface SelectQueryBuilderProps {
|
|
1304
1375
|
readonly queryId: QueryId;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference types="./select-query-builder.d.ts" />
|
|
2
2
|
import { AliasNode } from '../operation-node/alias-node.js';
|
|
3
|
+
import { SelectModifierNode } from '../operation-node/select-modifier-node.js';
|
|
3
4
|
import { parseJoin, } from '../parser/join-parser.js';
|
|
4
5
|
import { parseSelectExpressionOrList, parseSelectAll, } from '../parser/select-parser.js';
|
|
5
6
|
import { parseExistFilter, parseReferenceFilter, parseWhereFilter, parseHavingFilter, parseNotExistFilter, } from '../parser/filter-parser.js';
|
|
@@ -127,6 +128,60 @@ export class SelectQueryBuilder {
|
|
|
127
128
|
queryNode: SelectQueryNode.cloneWithDistinctOnSelections(this.#props.queryNode, parseSelectExpressionOrList(selection)),
|
|
128
129
|
});
|
|
129
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* This can be used to add any additional SQL to the front of the query __after__ the `select` keyword.
|
|
133
|
+
*
|
|
134
|
+
* ### Examples
|
|
135
|
+
*
|
|
136
|
+
* ```ts
|
|
137
|
+
* db.selectFrom('person')
|
|
138
|
+
* .modifyFront(sql`sql_no_cache`)
|
|
139
|
+
* .select('first_name')
|
|
140
|
+
* .execute()
|
|
141
|
+
* ```
|
|
142
|
+
*
|
|
143
|
+
* The generated SQL (MySQL):
|
|
144
|
+
*
|
|
145
|
+
* ```sql
|
|
146
|
+
* select sql_no_cache `first_name`
|
|
147
|
+
* from `person`
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
modifyFront(modifier) {
|
|
151
|
+
return new SelectQueryBuilder({
|
|
152
|
+
...this.#props,
|
|
153
|
+
queryNode: SelectQueryNode.cloneWithFrontModifier(this.#props.queryNode, SelectModifierNode.createWithRaw(modifier.toOperationNode())),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* This can be used to add any additional SQL to the end of the query.
|
|
158
|
+
*
|
|
159
|
+
* Also see {@link forUpdate}, {@link forShare}, {@link forKeyShare}, {@link forNoKeyUpdate}
|
|
160
|
+
* {@link skipLocked} and {@link noWait}.
|
|
161
|
+
*
|
|
162
|
+
* ### Examples
|
|
163
|
+
*
|
|
164
|
+
* ```ts
|
|
165
|
+
* db.selectFrom('person')
|
|
166
|
+
* .select('first_name')
|
|
167
|
+
* .modifyEnd(sql`for update`)
|
|
168
|
+
* .execute()
|
|
169
|
+
* ```
|
|
170
|
+
*
|
|
171
|
+
* The generated SQL (PostgreSQL):
|
|
172
|
+
*
|
|
173
|
+
* ```sql
|
|
174
|
+
* select "first_name"
|
|
175
|
+
* from "person"
|
|
176
|
+
* for update
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
modifyEnd(modifier) {
|
|
180
|
+
return new SelectQueryBuilder({
|
|
181
|
+
...this.#props,
|
|
182
|
+
queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.createWithRaw(modifier.toOperationNode())),
|
|
183
|
+
});
|
|
184
|
+
}
|
|
130
185
|
/**
|
|
131
186
|
* Makes the selection distinct.
|
|
132
187
|
*
|
|
@@ -148,61 +203,61 @@ export class SelectQueryBuilder {
|
|
|
148
203
|
distinct() {
|
|
149
204
|
return new SelectQueryBuilder({
|
|
150
205
|
...this.#props,
|
|
151
|
-
queryNode: SelectQueryNode.
|
|
206
|
+
queryNode: SelectQueryNode.cloneWithFrontModifier(this.#props.queryNode, SelectModifierNode.create('Distinct')),
|
|
152
207
|
});
|
|
153
208
|
}
|
|
154
209
|
/**
|
|
155
|
-
* Adds the `for update`
|
|
210
|
+
* Adds the `for update` modifier to a select query on supported databases.
|
|
156
211
|
*/
|
|
157
212
|
forUpdate() {
|
|
158
213
|
return new SelectQueryBuilder({
|
|
159
214
|
...this.#props,
|
|
160
|
-
queryNode: SelectQueryNode.
|
|
215
|
+
queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForUpdate')),
|
|
161
216
|
});
|
|
162
217
|
}
|
|
163
218
|
/**
|
|
164
|
-
* Adds the `for share`
|
|
219
|
+
* Adds the `for share` modifier to a select query on supported databases.
|
|
165
220
|
*/
|
|
166
221
|
forShare() {
|
|
167
222
|
return new SelectQueryBuilder({
|
|
168
223
|
...this.#props,
|
|
169
|
-
queryNode: SelectQueryNode.
|
|
224
|
+
queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForShare')),
|
|
170
225
|
});
|
|
171
226
|
}
|
|
172
227
|
/**
|
|
173
|
-
* Adds the `for key share`
|
|
228
|
+
* Adds the `for key share` modifier to a select query on supported databases.
|
|
174
229
|
*/
|
|
175
230
|
forKeyShare() {
|
|
176
231
|
return new SelectQueryBuilder({
|
|
177
232
|
...this.#props,
|
|
178
|
-
queryNode: SelectQueryNode.
|
|
233
|
+
queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForKeyShare')),
|
|
179
234
|
});
|
|
180
235
|
}
|
|
181
236
|
/**
|
|
182
|
-
* Adds the `for no key update`
|
|
237
|
+
* Adds the `for no key update` modifier to a select query on supported databases.
|
|
183
238
|
*/
|
|
184
239
|
forNoKeyUpdate() {
|
|
185
240
|
return new SelectQueryBuilder({
|
|
186
241
|
...this.#props,
|
|
187
|
-
queryNode: SelectQueryNode.
|
|
242
|
+
queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('ForNoKeyUpdate')),
|
|
188
243
|
});
|
|
189
244
|
}
|
|
190
245
|
/**
|
|
191
|
-
* Adds the `skip locked`
|
|
246
|
+
* Adds the `skip locked` modifier to a select query on supported databases.
|
|
192
247
|
*/
|
|
193
248
|
skipLocked() {
|
|
194
249
|
return new SelectQueryBuilder({
|
|
195
250
|
...this.#props,
|
|
196
|
-
queryNode: SelectQueryNode.
|
|
251
|
+
queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('SkipLocked')),
|
|
197
252
|
});
|
|
198
253
|
}
|
|
199
254
|
/**
|
|
200
|
-
* Adds the `nowait`
|
|
255
|
+
* Adds the `nowait` modifier to a select query on supported databases.
|
|
201
256
|
*/
|
|
202
257
|
noWait() {
|
|
203
258
|
return new SelectQueryBuilder({
|
|
204
259
|
...this.#props,
|
|
205
|
-
queryNode: SelectQueryNode.
|
|
260
|
+
queryNode: SelectQueryNode.cloneWithEndModifier(this.#props.queryNode, SelectModifierNode.create('NoWait')),
|
|
206
261
|
});
|
|
207
262
|
}
|
|
208
263
|
selectAll(table) {
|
|
@@ -573,7 +628,6 @@ export class SelectQueryBuilder {
|
|
|
573
628
|
*/
|
|
574
629
|
async execute() {
|
|
575
630
|
const compildQuery = this.compile();
|
|
576
|
-
const query = compildQuery.query;
|
|
577
631
|
const result = await this.#props.executor.executeQuery(compildQuery, this.#props.queryId);
|
|
578
632
|
return result.rows;
|
|
579
633
|
}
|
|
@@ -600,6 +654,39 @@ export class SelectQueryBuilder {
|
|
|
600
654
|
}
|
|
601
655
|
return result;
|
|
602
656
|
}
|
|
657
|
+
/**
|
|
658
|
+
* Executes the query and streams the rows.
|
|
659
|
+
*
|
|
660
|
+
* The optional argument `chunkSize` defines how many rows to fetch from the database
|
|
661
|
+
* at a time. It only affects some dialects like PostgreSQL that support it.
|
|
662
|
+
*
|
|
663
|
+
* ### Examples
|
|
664
|
+
*
|
|
665
|
+
* ```ts
|
|
666
|
+
* const stream = db.
|
|
667
|
+
* .selectFrom('person')
|
|
668
|
+
* .select(['first_name', 'last_name'])
|
|
669
|
+
* .where('gender', '=', 'other')
|
|
670
|
+
* .stream()
|
|
671
|
+
*
|
|
672
|
+
* for await (const person of stream) {
|
|
673
|
+
* console.log(person.first_name)
|
|
674
|
+
*
|
|
675
|
+
* if (person.last_name === 'Something') {
|
|
676
|
+
* // Breaking or returning before the stream has ended will release
|
|
677
|
+
* // the database connection and invalidate the stream.
|
|
678
|
+
* break
|
|
679
|
+
* }
|
|
680
|
+
* }
|
|
681
|
+
* ```
|
|
682
|
+
*/
|
|
683
|
+
async *stream(chunkSize = 100) {
|
|
684
|
+
const compildQuery = this.compile();
|
|
685
|
+
const stream = this.#props.executor.stream(compildQuery, chunkSize, this.#props.queryId);
|
|
686
|
+
for await (const item of stream) {
|
|
687
|
+
yield* item.rows;
|
|
688
|
+
}
|
|
689
|
+
}
|
|
603
690
|
}
|
|
604
691
|
preventAwait(SelectQueryBuilder, "don't await SelectQueryBuilder instances directly. To execute the query you need to call `execute` or `executeTakeFirst`.");
|
|
605
692
|
/**
|
|
@@ -68,6 +68,9 @@ import { DefaultValueNode } from '../operation-node/default-value-node.js';
|
|
|
68
68
|
import { OnNode } from '../operation-node/on-node.js';
|
|
69
69
|
import { ValuesNode } from '../operation-node/values-node.js';
|
|
70
70
|
import { CommonTableExpressionNameNode } from '../operation-node/common-table-expression-name-node.js';
|
|
71
|
+
import { SelectModifierNode } from '../operation-node/select-modifier-node.js';
|
|
72
|
+
import { CreateTypeNode } from '../operation-node/create-type-node.js';
|
|
73
|
+
import { DropTypeNode } from '../operation-node/drop-type-node.js';
|
|
71
74
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
72
75
|
#private;
|
|
73
76
|
protected get numParameters(): number;
|
|
@@ -143,6 +146,9 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
143
146
|
protected visitDropView(node: DropViewNode): void;
|
|
144
147
|
protected visitGenerated(node: GeneratedNode): void;
|
|
145
148
|
protected visitDefaultValue(node: DefaultValueNode): void;
|
|
149
|
+
protected visitSelectModifier(node: SelectModifierNode): void;
|
|
150
|
+
protected visitCreateType(node: CreateTypeNode): void;
|
|
151
|
+
protected visitDropType(node: DropTypeNode): void;
|
|
146
152
|
protected append(str: string): void;
|
|
147
153
|
protected appendValue(parameter: unknown): void;
|
|
148
154
|
protected getLeftIdentifierWrapper(): string;
|
|
@@ -42,8 +42,8 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
42
42
|
this.compileDistinctOn(node.distinctOnSelections);
|
|
43
43
|
this.append(' ');
|
|
44
44
|
}
|
|
45
|
-
if (node.
|
|
46
|
-
this.
|
|
45
|
+
if (node.frontModifiers && node.frontModifiers.length > 0) {
|
|
46
|
+
this.compileList(node.frontModifiers, ' ');
|
|
47
47
|
this.append(' ');
|
|
48
48
|
}
|
|
49
49
|
if (node.selections) {
|
|
@@ -83,11 +83,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
83
83
|
this.append(' ');
|
|
84
84
|
this.visitNode(node.offset);
|
|
85
85
|
}
|
|
86
|
-
if (node.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
this.append(SELECT_MODIFIER_SQL[modifier]);
|
|
90
|
-
});
|
|
86
|
+
if (node.endModifiers && node.endModifiers.length > 0) {
|
|
87
|
+
this.append(' ');
|
|
88
|
+
this.compileList(node.endModifiers, ' ');
|
|
91
89
|
}
|
|
92
90
|
if (wrapInParens) {
|
|
93
91
|
this.append(')');
|
|
@@ -134,7 +132,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
134
132
|
this.visitNode(node.with);
|
|
135
133
|
this.append(' ');
|
|
136
134
|
}
|
|
137
|
-
this.append('insert');
|
|
135
|
+
this.append(node.replace ? 'replace' : 'insert');
|
|
138
136
|
if (node.ignore) {
|
|
139
137
|
this.append(' ignore');
|
|
140
138
|
}
|
|
@@ -783,6 +781,29 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
783
781
|
this.append('default ');
|
|
784
782
|
this.visitNode(node.defaultValue);
|
|
785
783
|
}
|
|
784
|
+
visitSelectModifier(node) {
|
|
785
|
+
if (node.rawModifier) {
|
|
786
|
+
this.visitNode(node.rawModifier);
|
|
787
|
+
}
|
|
788
|
+
else {
|
|
789
|
+
this.append(SELECT_MODIFIER_SQL[node.modifier]);
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
visitCreateType(node) {
|
|
793
|
+
this.append('create type ');
|
|
794
|
+
this.visitNode(node.name);
|
|
795
|
+
if (node.enum) {
|
|
796
|
+
this.append(' as enum ');
|
|
797
|
+
this.visitNode(node.enum);
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
visitDropType(node) {
|
|
801
|
+
this.append('drop type ');
|
|
802
|
+
if (node.ifExists) {
|
|
803
|
+
this.append('if exists ');
|
|
804
|
+
}
|
|
805
|
+
this.visitNode(node.name);
|
|
806
|
+
}
|
|
786
807
|
append(str) {
|
|
787
808
|
this.#sql += str;
|
|
788
809
|
}
|
|
@@ -830,6 +851,7 @@ const SELECT_MODIFIER_SQL = freeze({
|
|
|
830
851
|
ForShare: 'for share',
|
|
831
852
|
NoWait: 'nowait',
|
|
832
853
|
SkipLocked: 'skip locked',
|
|
854
|
+
Distinct: 'distinct',
|
|
833
855
|
});
|
|
834
856
|
const JOIN_TYPE_SQL = freeze({
|
|
835
857
|
InnerJoin: 'inner join',
|
|
@@ -2,15 +2,17 @@ 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 { CreateTypeNode } from '../operation-node/create-type-node.js';
|
|
5
6
|
import { CreateViewNode } from '../operation-node/create-view-node.js';
|
|
6
7
|
import { DropIndexNode } from '../operation-node/drop-index-node.js';
|
|
7
8
|
import { DropSchemaNode } from '../operation-node/drop-schema-node.js';
|
|
8
9
|
import { DropTableNode } from '../operation-node/drop-table-node.js';
|
|
10
|
+
import { DropTypeNode } from '../operation-node/drop-type-node.js';
|
|
9
11
|
import { DropViewNode } from '../operation-node/drop-view-node.js';
|
|
10
12
|
import { QueryNode } from '../operation-node/query-node.js';
|
|
11
13
|
import { RawNode } from '../operation-node/raw-node.js';
|
|
12
14
|
import { CompiledQuery } from './compiled-query.js';
|
|
13
|
-
export declare type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | CreateSchemaNode | CreateViewNode | DropTableNode | DropIndexNode | DropSchemaNode | DropViewNode | AlterTableNode | RawNode;
|
|
15
|
+
export declare type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | CreateSchemaNode | CreateViewNode | DropTableNode | DropIndexNode | DropSchemaNode | DropViewNode | AlterTableNode | RawNode | CreateTypeNode | DropTypeNode;
|
|
14
16
|
/**
|
|
15
17
|
* a `QueryCompiler` compiles a query expressed as a tree of `OperationNodes` into SQL.
|
|
16
18
|
*/
|
|
@@ -161,6 +161,33 @@ export declare class QueryCreator<DB> {
|
|
|
161
161
|
* ```
|
|
162
162
|
*/
|
|
163
163
|
insertInto<T extends keyof DB & string>(table: T): InsertQueryBuilder<DB, T, InsertResult>;
|
|
164
|
+
/**
|
|
165
|
+
* Creates a replace query.
|
|
166
|
+
*
|
|
167
|
+
* A MySQL-only statement similar to {@link InsertQueryBuilder.onDuplicateKeyUpdate}
|
|
168
|
+
* that deletes and inserts values on collision instead of updating existing rows.
|
|
169
|
+
*
|
|
170
|
+
* The return value of this query is an instance of {@link InsertResult}. {@link InsertResult}
|
|
171
|
+
* has the {@link InsertResult.insertId | insertId} field that holds the auto incremented id of
|
|
172
|
+
* the inserted row if the db returned one.
|
|
173
|
+
*
|
|
174
|
+
* See the {@link InsertQueryBuilder.values | values} method for more info and examples.
|
|
175
|
+
*
|
|
176
|
+
* ### Examples
|
|
177
|
+
*
|
|
178
|
+
* ```ts
|
|
179
|
+
* const result = await db
|
|
180
|
+
* .replaceInto('person')
|
|
181
|
+
* .values({
|
|
182
|
+
* first_name: 'Jennifer',
|
|
183
|
+
* last_name: 'Aniston'
|
|
184
|
+
* })
|
|
185
|
+
* .executeTakeFirst()
|
|
186
|
+
*
|
|
187
|
+
* console.log(result.insertId)
|
|
188
|
+
* ```
|
|
189
|
+
*/
|
|
190
|
+
replaceInto<T extends keyof DB & string>(table: T): InsertQueryBuilder<DB, T, InsertResult>;
|
|
164
191
|
/**
|
|
165
192
|
* Creates a delete query.
|
|
166
193
|
*
|
|
@@ -70,6 +70,39 @@ export class QueryCreator {
|
|
|
70
70
|
queryNode: InsertQueryNode.create(parseTable(table), this.#props.withNode),
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Creates a replace query.
|
|
75
|
+
*
|
|
76
|
+
* A MySQL-only statement similar to {@link InsertQueryBuilder.onDuplicateKeyUpdate}
|
|
77
|
+
* that deletes and inserts values on collision instead of updating existing rows.
|
|
78
|
+
*
|
|
79
|
+
* The return value of this query is an instance of {@link InsertResult}. {@link InsertResult}
|
|
80
|
+
* has the {@link InsertResult.insertId | insertId} field that holds the auto incremented id of
|
|
81
|
+
* the inserted row if the db returned one.
|
|
82
|
+
*
|
|
83
|
+
* See the {@link InsertQueryBuilder.values | values} method for more info and examples.
|
|
84
|
+
*
|
|
85
|
+
* ### Examples
|
|
86
|
+
*
|
|
87
|
+
* ```ts
|
|
88
|
+
* const result = await db
|
|
89
|
+
* .replaceInto('person')
|
|
90
|
+
* .values({
|
|
91
|
+
* first_name: 'Jennifer',
|
|
92
|
+
* last_name: 'Aniston'
|
|
93
|
+
* })
|
|
94
|
+
* .executeTakeFirst()
|
|
95
|
+
*
|
|
96
|
+
* console.log(result.insertId)
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
replaceInto(table) {
|
|
100
|
+
return new InsertQueryBuilder({
|
|
101
|
+
queryId: createQueryId(),
|
|
102
|
+
executor: this.#props.executor,
|
|
103
|
+
queryNode: InsertQueryNode.create(parseTable(table), this.#props.withNode, true),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
73
106
|
/**
|
|
74
107
|
* Creates a delete query.
|
|
75
108
|
*
|
|
@@ -36,6 +36,12 @@ export declare abstract class QueryExecutorBase implements QueryExecutor {
|
|
|
36
36
|
* `transformResult` method.
|
|
37
37
|
*/
|
|
38
38
|
executeQuery<R>(compiledQuery: CompiledQuery, queryId: QueryId): Promise<QueryResult<R>>;
|
|
39
|
+
/**
|
|
40
|
+
* Executes a compiled query and runs the result through all plugins'
|
|
41
|
+
* `transformResult` method. Results are streamead instead of loaded
|
|
42
|
+
* at once.
|
|
43
|
+
*/
|
|
44
|
+
stream<R>(compiledQuery: CompiledQuery, chunkSize: number, queryId: QueryId): AsyncIterableIterator<QueryResult<R>>;
|
|
39
45
|
/**
|
|
40
46
|
* Returns a copy of this executor with a new connection provider.
|
|
41
47
|
*/
|