kysely 0.16.8 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +23 -11
- package/dist/cjs/dialect/mysql/mysql-adapter.js +3 -4
- package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -1
- package/dist/cjs/dialect/postgres/postgres-adapter.js +3 -2
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +2 -1
- package/dist/cjs/index-nodeless.d.ts +2 -0
- package/dist/cjs/index-nodeless.js +2 -0
- package/dist/cjs/kysely.d.ts +3 -6
- package/dist/cjs/kysely.js +9 -14
- package/dist/cjs/migration/migrator.d.ts +22 -0
- package/dist/cjs/migration/migrator.js +27 -5
- package/dist/cjs/operation-node/delete-query-node.d.ts +7 -0
- package/dist/cjs/operation-node/delete-query-node.js +15 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +1 -1
- package/dist/cjs/operation-node/raw-node.d.ts +4 -2
- package/dist/cjs/operation-node/raw-node.js +8 -2
- package/dist/cjs/parser/complex-expression-parser.d.ts +5 -5
- package/dist/cjs/parser/complex-expression-parser.js +5 -4
- package/dist/cjs/parser/filter-parser.d.ts +9 -9
- package/dist/cjs/parser/filter-parser.js +31 -30
- package/dist/cjs/parser/group-by-parser.d.ts +1 -2
- package/dist/cjs/parser/group-by-parser.js +2 -2
- package/dist/cjs/parser/insert-values-parser.d.ts +1 -2
- package/dist/cjs/parser/insert-values-parser.js +6 -6
- package/dist/cjs/parser/join-parser.d.ts +1 -2
- package/dist/cjs/parser/join-parser.js +8 -7
- package/dist/cjs/parser/order-by-parser.d.ts +1 -2
- package/dist/cjs/parser/order-by-parser.js +4 -4
- package/dist/cjs/parser/parse-utils.d.ts +10 -0
- package/dist/cjs/parser/parse-utils.js +38 -0
- package/dist/cjs/parser/reference-parser.d.ts +2 -3
- package/dist/cjs/parser/reference-parser.js +5 -5
- package/dist/cjs/parser/select-parser.d.ts +1 -2
- package/dist/cjs/parser/select-parser.js +5 -5
- package/dist/cjs/parser/table-parser.d.ts +2 -3
- package/dist/cjs/parser/table-parser.js +5 -5
- package/dist/cjs/parser/update-set-parser.d.ts +1 -2
- package/dist/cjs/parser/update-set-parser.js +2 -2
- package/dist/cjs/parser/value-parser.d.ts +3 -4
- package/dist/cjs/parser/value-parser.js +7 -7
- package/dist/cjs/parser/with-parser.d.ts +1 -2
- package/dist/cjs/parser/with-parser.js +3 -2
- package/dist/cjs/query-builder/delete-query-builder.d.ts +77 -20
- package/dist/cjs/query-builder/delete-query-builder.js +81 -14
- package/dist/cjs/query-builder/expression-builder.d.ts +4 -13
- package/dist/cjs/query-builder/expression-builder.js +12 -21
- package/dist/cjs/query-builder/function-builder.d.ts +2 -6
- package/dist/cjs/query-builder/function-builder.js +5 -8
- package/dist/cjs/query-builder/insert-query-builder.d.ts +11 -9
- package/dist/cjs/query-builder/insert-query-builder.js +8 -7
- package/dist/cjs/query-builder/join-builder.d.ts +0 -2
- package/dist/cjs/query-builder/join-builder.js +8 -8
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +24 -20
- package/dist/cjs/query-builder/on-conflict-builder.js +17 -17
- package/dist/cjs/query-builder/returning-interface.d.ts +2 -2
- package/dist/cjs/query-builder/select-query-builder.d.ts +43 -32
- package/dist/cjs/query-builder/select-query-builder.js +28 -26
- package/dist/cjs/query-builder/update-query-builder.d.ts +29 -25
- package/dist/cjs/query-builder/update-query-builder.js +22 -20
- package/dist/cjs/query-builder/where-interface.d.ts +20 -16
- package/dist/cjs/query-compiler/default-query-compiler.js +16 -7
- package/dist/cjs/query-creator.d.ts +24 -138
- package/dist/cjs/query-creator.js +19 -145
- package/dist/cjs/query-executor/default-query-executor.d.ts +8 -1
- package/dist/cjs/query-executor/default-query-executor.js +13 -13
- package/dist/cjs/query-executor/noop-query-executor.d.ts +8 -0
- package/dist/cjs/query-executor/noop-query-executor.js +8 -1
- package/dist/cjs/query-executor/query-executor-provider.d.ts +8 -0
- package/dist/cjs/query-executor/query-executor-provider.js +2 -0
- package/dist/cjs/query-executor/query-executor.d.ts +7 -0
- package/dist/cjs/raw-builder/raw-builder.d.ts +42 -11
- package/dist/cjs/raw-builder/raw-builder.js +55 -56
- package/dist/cjs/raw-builder/sql.d.ts +323 -0
- package/dist/cjs/raw-builder/sql.js +153 -0
- package/dist/cjs/schema/alter-table-builder.d.ts +20 -8
- package/dist/cjs/schema/alter-table-builder.js +3 -3
- package/dist/cjs/schema/column-definition-builder.d.ts +20 -8
- package/dist/cjs/schema/create-index-builder.d.ts +3 -1
- package/dist/cjs/schema/create-index-builder.js +3 -1
- package/dist/cjs/schema/create-table-builder.d.ts +6 -2
- package/dist/cjs/schema/create-table-builder.js +8 -4
- package/dist/cjs/schema/create-view-builder.d.ts +3 -3
- package/dist/cjs/schema/create-view-builder.js +3 -3
- package/dist/cjs/util/query-id.js +10 -4
- package/dist/cjs/util/random-string.js +65 -2
- package/dist/esm/dialect/mysql/mysql-adapter.js +3 -4
- package/dist/esm/dialect/mysql/mysql-introspector.js +2 -1
- package/dist/esm/dialect/postgres/postgres-adapter.js +3 -2
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +2 -1
- package/dist/esm/index-nodeless.d.ts +2 -0
- package/dist/esm/index-nodeless.js +2 -0
- package/dist/esm/kysely.d.ts +3 -6
- package/dist/esm/kysely.js +9 -14
- package/dist/esm/migration/migrator.d.ts +22 -0
- package/dist/esm/migration/migrator.js +27 -5
- package/dist/esm/operation-node/delete-query-node.d.ts +7 -0
- package/dist/esm/operation-node/delete-query-node.js +15 -0
- package/dist/esm/operation-node/operation-node-transformer.js +1 -1
- package/dist/esm/operation-node/raw-node.d.ts +4 -2
- package/dist/esm/operation-node/raw-node.js +8 -2
- package/dist/esm/parser/complex-expression-parser.d.ts +5 -5
- package/dist/esm/parser/complex-expression-parser.js +5 -4
- package/dist/esm/parser/filter-parser.d.ts +9 -9
- package/dist/esm/parser/filter-parser.js +31 -30
- package/dist/esm/parser/group-by-parser.d.ts +1 -2
- package/dist/esm/parser/group-by-parser.js +2 -2
- package/dist/esm/parser/insert-values-parser.d.ts +1 -2
- package/dist/esm/parser/insert-values-parser.js +6 -6
- package/dist/esm/parser/join-parser.d.ts +1 -2
- package/dist/esm/parser/join-parser.js +8 -7
- package/dist/esm/parser/order-by-parser.d.ts +1 -2
- package/dist/esm/parser/order-by-parser.js +4 -4
- package/dist/esm/parser/parse-utils.d.ts +10 -0
- package/dist/esm/parser/parse-utils.js +32 -0
- package/dist/esm/parser/reference-parser.d.ts +2 -3
- package/dist/esm/parser/reference-parser.js +5 -5
- package/dist/esm/parser/select-parser.d.ts +1 -2
- package/dist/esm/parser/select-parser.js +5 -5
- package/dist/esm/parser/table-parser.d.ts +2 -3
- package/dist/esm/parser/table-parser.js +5 -5
- package/dist/esm/parser/update-set-parser.d.ts +1 -2
- package/dist/esm/parser/update-set-parser.js +2 -2
- package/dist/esm/parser/value-parser.d.ts +3 -4
- package/dist/esm/parser/value-parser.js +7 -7
- package/dist/esm/parser/with-parser.d.ts +1 -2
- package/dist/esm/parser/with-parser.js +3 -2
- package/dist/esm/query-builder/delete-query-builder.d.ts +77 -20
- package/dist/esm/query-builder/delete-query-builder.js +81 -14
- package/dist/esm/query-builder/expression-builder.d.ts +4 -13
- package/dist/esm/query-builder/expression-builder.js +12 -21
- package/dist/esm/query-builder/function-builder.d.ts +2 -6
- package/dist/esm/query-builder/function-builder.js +5 -8
- package/dist/esm/query-builder/insert-query-builder.d.ts +11 -9
- package/dist/esm/query-builder/insert-query-builder.js +8 -7
- package/dist/esm/query-builder/join-builder.d.ts +0 -2
- package/dist/esm/query-builder/join-builder.js +8 -8
- package/dist/esm/query-builder/on-conflict-builder.d.ts +24 -20
- package/dist/esm/query-builder/on-conflict-builder.js +17 -17
- package/dist/esm/query-builder/returning-interface.d.ts +2 -2
- package/dist/esm/query-builder/select-query-builder.d.ts +43 -32
- package/dist/esm/query-builder/select-query-builder.js +28 -26
- package/dist/esm/query-builder/update-query-builder.d.ts +29 -25
- package/dist/esm/query-builder/update-query-builder.js +22 -20
- package/dist/esm/query-builder/where-interface.d.ts +20 -16
- package/dist/esm/query-compiler/default-query-compiler.js +16 -7
- package/dist/esm/query-creator.d.ts +24 -138
- package/dist/esm/query-creator.js +19 -145
- package/dist/esm/query-executor/default-query-executor.d.ts +8 -1
- package/dist/esm/query-executor/default-query-executor.js +13 -13
- package/dist/esm/query-executor/noop-query-executor.d.ts +8 -0
- package/dist/esm/query-executor/noop-query-executor.js +7 -0
- package/dist/esm/query-executor/query-executor-provider.d.ts +8 -0
- package/dist/esm/query-executor/query-executor-provider.js +2 -0
- package/dist/esm/query-executor/query-executor.d.ts +7 -0
- package/dist/esm/raw-builder/raw-builder.d.ts +42 -11
- package/dist/esm/raw-builder/raw-builder.js +56 -57
- package/dist/esm/raw-builder/sql.d.ts +323 -0
- package/dist/esm/raw-builder/sql.js +151 -0
- package/dist/esm/schema/alter-table-builder.d.ts +20 -8
- package/dist/esm/schema/alter-table-builder.js +3 -3
- package/dist/esm/schema/column-definition-builder.d.ts +20 -8
- package/dist/esm/schema/create-index-builder.d.ts +3 -1
- package/dist/esm/schema/create-index-builder.js +3 -1
- package/dist/esm/schema/create-table-builder.d.ts +6 -2
- package/dist/esm/schema/create-table-builder.js +8 -4
- package/dist/esm/schema/create-view-builder.d.ts +3 -3
- package/dist/esm/schema/create-view-builder.js +3 -3
- package/dist/esm/util/query-id.js +10 -4
- package/dist/esm/util/random-string.js +65 -2
- package/package.json +13 -13
- package/dist/cjs/parser/parse-context.d.ts +0 -55
- package/dist/cjs/parser/parse-context.js +0 -50
- package/dist/cjs/util/private-symbols.d.ts +0 -5
- package/dist/cjs/util/private-symbols.js +0 -8
- package/dist/esm/parser/parse-context.d.ts +0 -55
- package/dist/esm/parser/parse-context.js +0 -47
- package/dist/esm/util/private-symbols.d.ts +0 -5
- package/dist/esm/util/private-symbols.js +0 -6
|
@@ -19,81 +19,81 @@ class UpdateQueryBuilder {
|
|
|
19
19
|
where(...args) {
|
|
20
20
|
return new UpdateQueryBuilder({
|
|
21
21
|
...this.#props,
|
|
22
|
-
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseWhereFilter)(
|
|
22
|
+
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseWhereFilter)(args)),
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
whereRef(lhs, op, rhs) {
|
|
26
26
|
return new UpdateQueryBuilder({
|
|
27
27
|
...this.#props,
|
|
28
|
-
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(
|
|
28
|
+
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(lhs, op, rhs)),
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
31
|
orWhere(...args) {
|
|
32
32
|
return new UpdateQueryBuilder({
|
|
33
33
|
...this.#props,
|
|
34
|
-
queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseWhereFilter)(
|
|
34
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseWhereFilter)(args)),
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
37
|
orWhereRef(lhs, op, rhs) {
|
|
38
38
|
return new UpdateQueryBuilder({
|
|
39
39
|
...this.#props,
|
|
40
|
-
queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(
|
|
40
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(lhs, op, rhs)),
|
|
41
41
|
});
|
|
42
42
|
}
|
|
43
43
|
whereExists(arg) {
|
|
44
44
|
return new UpdateQueryBuilder({
|
|
45
45
|
...this.#props,
|
|
46
|
-
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(
|
|
46
|
+
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(arg)),
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
49
|
whereNotExists(arg) {
|
|
50
50
|
return new UpdateQueryBuilder({
|
|
51
51
|
...this.#props,
|
|
52
|
-
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(
|
|
52
|
+
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(arg)),
|
|
53
53
|
});
|
|
54
54
|
}
|
|
55
55
|
orWhereExists(arg) {
|
|
56
56
|
return new UpdateQueryBuilder({
|
|
57
57
|
...this.#props,
|
|
58
|
-
queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(
|
|
58
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(arg)),
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
61
|
orWhereNotExists(arg) {
|
|
62
62
|
return new UpdateQueryBuilder({
|
|
63
63
|
...this.#props,
|
|
64
|
-
queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(
|
|
64
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(arg)),
|
|
65
65
|
});
|
|
66
66
|
}
|
|
67
67
|
innerJoin(...args) {
|
|
68
68
|
return new UpdateQueryBuilder({
|
|
69
69
|
...this.#props,
|
|
70
|
-
queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)(
|
|
70
|
+
queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('InnerJoin', args)),
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
73
|
leftJoin(...args) {
|
|
74
74
|
return new UpdateQueryBuilder({
|
|
75
75
|
...this.#props,
|
|
76
|
-
queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)(
|
|
76
|
+
queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('LeftJoin', args)),
|
|
77
77
|
});
|
|
78
78
|
}
|
|
79
79
|
rightJoin(...args) {
|
|
80
80
|
return new UpdateQueryBuilder({
|
|
81
81
|
...this.#props,
|
|
82
|
-
queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)(
|
|
82
|
+
queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('RightJoin', args)),
|
|
83
83
|
});
|
|
84
84
|
}
|
|
85
85
|
fullJoin(...args) {
|
|
86
86
|
return new UpdateQueryBuilder({
|
|
87
87
|
...this.#props,
|
|
88
|
-
queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)(
|
|
88
|
+
queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('FullJoin', args)),
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
91
|
/**
|
|
92
92
|
* Sets the values to update for an {@link Kysely.updateTable | update} query.
|
|
93
93
|
*
|
|
94
94
|
* This method takes an object whose keys are column names and values are
|
|
95
|
-
* values to update. In addition to the column's type, the values can be
|
|
96
|
-
*
|
|
95
|
+
* values to update. In addition to the column's type, the values can be
|
|
96
|
+
* raw {@link sql} snippets or select queries.
|
|
97
97
|
*
|
|
98
98
|
* The return value of an update query is an instance of {@link UpdateResult}.
|
|
99
99
|
* You can use the {@link returning} method on supported databases to get out
|
|
@@ -146,16 +146,18 @@ class UpdateQueryBuilder {
|
|
|
146
146
|
* update "person" set "first_name" = $1, "last_name" = $2 where "id" = $3 returning "id"
|
|
147
147
|
* ```
|
|
148
148
|
*
|
|
149
|
-
* In addition to primitives, the values can also be
|
|
149
|
+
* In addition to primitives, the values can also be raw sql expressions or
|
|
150
150
|
* select queries:
|
|
151
151
|
*
|
|
152
152
|
* ```ts
|
|
153
|
+
* import { sql } from 'kysely'
|
|
154
|
+
*
|
|
153
155
|
* const result = await db
|
|
154
156
|
* .updateTable('person')
|
|
155
157
|
* .set({
|
|
156
158
|
* first_name: 'Jennifer',
|
|
157
|
-
* last_name:
|
|
158
|
-
* age: db.selectFrom('person').select(
|
|
159
|
+
* last_name: sql`${'Ani'} || ${'ston'}`,
|
|
160
|
+
* age: db.selectFrom('person').select(sql`avg(age)`),
|
|
159
161
|
* })
|
|
160
162
|
* .where('id', '=', 1)
|
|
161
163
|
* .executeTakeFirst()
|
|
@@ -176,13 +178,13 @@ class UpdateQueryBuilder {
|
|
|
176
178
|
set(row) {
|
|
177
179
|
return new UpdateQueryBuilder({
|
|
178
180
|
...this.#props,
|
|
179
|
-
queryNode: update_query_node_js_1.UpdateQueryNode.cloneWithUpdates(this.#props.queryNode, (0, update_set_parser_js_1.parseUpdateObject)(
|
|
181
|
+
queryNode: update_query_node_js_1.UpdateQueryNode.cloneWithUpdates(this.#props.queryNode, (0, update_set_parser_js_1.parseUpdateObject)(row)),
|
|
180
182
|
});
|
|
181
183
|
}
|
|
182
184
|
returning(selection) {
|
|
183
185
|
return new UpdateQueryBuilder({
|
|
184
186
|
...this.#props,
|
|
185
|
-
queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectExpressionOrList)(
|
|
187
|
+
queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectExpressionOrList)(selection)),
|
|
186
188
|
});
|
|
187
189
|
}
|
|
188
190
|
returningAll() {
|
|
@@ -293,7 +295,7 @@ class UpdateQueryBuilder {
|
|
|
293
295
|
const compildQuery = this.compile();
|
|
294
296
|
const query = compildQuery.query;
|
|
295
297
|
const result = await this.#props.executor.executeQuery(compildQuery, this.#props.queryId);
|
|
296
|
-
if (this.#props.
|
|
298
|
+
if (this.#props.executor.adapter.supportsReturning && query.returning) {
|
|
297
299
|
return result.rows;
|
|
298
300
|
}
|
|
299
301
|
else {
|
|
@@ -26,7 +26,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
|
|
|
26
26
|
* ```
|
|
27
27
|
*
|
|
28
28
|
* Operator can be any supported operator or if the typings don't support it
|
|
29
|
-
* you can always use `
|
|
29
|
+
* you can always use `sql\`your operator\``.
|
|
30
30
|
*
|
|
31
31
|
* ```ts
|
|
32
32
|
* const persons = await db
|
|
@@ -96,7 +96,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
|
|
|
96
96
|
*
|
|
97
97
|
* A `where in` query can be built by using the `in` operator and an array
|
|
98
98
|
* of values. The values in the array can also be subqueries or raw
|
|
99
|
-
*
|
|
99
|
+
* {@link sql} expressions.
|
|
100
100
|
*
|
|
101
101
|
* ```ts
|
|
102
102
|
* const persons = await db
|
|
@@ -112,15 +112,17 @@ export interface WhereInterface<DB, TB extends keyof DB> {
|
|
|
112
112
|
* select * from "person" where "id" in ($1, $2, $3)
|
|
113
113
|
* ```
|
|
114
114
|
*
|
|
115
|
-
* If everything else fails, you can always
|
|
115
|
+
* If everything else fails, you can always use the {@link sql} tag
|
|
116
116
|
* as any of the arguments, including the operator:
|
|
117
117
|
*
|
|
118
118
|
* ```ts
|
|
119
|
+
* import { sql } from 'kysely'
|
|
120
|
+
*
|
|
119
121
|
* const persons = await db
|
|
120
122
|
* .selectFrom('person')
|
|
121
123
|
* .selectAll()
|
|
122
124
|
* .where(
|
|
123
|
-
*
|
|
125
|
+
* sql`coalesce(first_name, last_name)`,
|
|
124
126
|
* 'like',
|
|
125
127
|
* '%' + name + '%',
|
|
126
128
|
* )
|
|
@@ -155,24 +157,25 @@ export interface WhereInterface<DB, TB extends keyof DB> {
|
|
|
155
157
|
* ```
|
|
156
158
|
*
|
|
157
159
|
* In all examples above the columns were known at compile time
|
|
158
|
-
* (except for the
|
|
159
|
-
* you to refer to columns that exist in the database **and**
|
|
160
|
-
* referred to in the current query and context.
|
|
160
|
+
* (except for the raw {@link sql} expressions). By default kysely only
|
|
161
|
+
* allows you to refer to columns that exist in the database **and**
|
|
162
|
+
* can be referred to in the current query and context.
|
|
161
163
|
*
|
|
162
164
|
* Sometimes you may want to refer to columns that come from the user
|
|
163
165
|
* input and thus are not available at compile time.
|
|
164
166
|
*
|
|
165
|
-
* You have two options,
|
|
167
|
+
* You have two options, the {@link sql} tag or `db.dynamic`. The example below
|
|
166
168
|
* uses both:
|
|
167
169
|
*
|
|
168
170
|
* ```ts
|
|
171
|
+
* import { sql } from 'kysely'
|
|
169
172
|
* const { ref } = db.dynamic
|
|
170
173
|
*
|
|
171
174
|
* const persons = await db
|
|
172
175
|
* .selectFrom('person')
|
|
173
176
|
* .selectAll()
|
|
174
177
|
* .where(ref(columnFromUserInput), '=', 1)
|
|
175
|
-
* .orWhere(
|
|
178
|
+
* .orWhere(sql.id(columnFromUserInput), '=', 2)
|
|
176
179
|
* .execute()
|
|
177
180
|
* ```
|
|
178
181
|
*/
|
|
@@ -306,13 +309,14 @@ export interface WhereInterface<DB, TB extends keyof DB> {
|
|
|
306
309
|
/**
|
|
307
310
|
* Adds a `where exists` clause to the query.
|
|
308
311
|
*
|
|
309
|
-
* You can either use a subquery or a raw
|
|
312
|
+
* You can either use a subquery or a raw {@link sql} snippet.
|
|
310
313
|
*
|
|
311
314
|
* ### Examples
|
|
312
315
|
*
|
|
313
316
|
* The query below selets all persons that own a pet named Catto:
|
|
314
317
|
*
|
|
315
318
|
* ```ts
|
|
319
|
+
* const petName = 'Catto'
|
|
316
320
|
* const persons = await db
|
|
317
321
|
* .selectFrom('person')
|
|
318
322
|
* .selectAll()
|
|
@@ -320,7 +324,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
|
|
|
320
324
|
* .selectFrom('pet')
|
|
321
325
|
* .select('pet.id')
|
|
322
326
|
* .whereRef('person.id', '=', 'pet.owner_id')
|
|
323
|
-
* .where('pet.name', '=',
|
|
327
|
+
* .where('pet.name', '=', petName)
|
|
324
328
|
* )
|
|
325
329
|
* .execute()
|
|
326
330
|
* ```
|
|
@@ -337,16 +341,16 @@ export interface WhereInterface<DB, TB extends keyof DB> {
|
|
|
337
341
|
* )
|
|
338
342
|
* ```
|
|
339
343
|
*
|
|
340
|
-
* The same query as in the previous example but with using raw:
|
|
344
|
+
* The same query as in the previous example but with using raw {@link sql}:
|
|
341
345
|
*
|
|
342
346
|
* ```ts
|
|
347
|
+
* import { sql } from 'kysely'
|
|
348
|
+
*
|
|
349
|
+
* const petName = 'Catto'
|
|
343
350
|
* db.selectFrom('person')
|
|
344
351
|
* .selectAll()
|
|
345
352
|
* .whereExists(
|
|
346
|
-
*
|
|
347
|
-
* '(select pet.id from pet where person.id = pet.owner_id and pet.name = ?)',
|
|
348
|
-
* ['Catto']
|
|
349
|
-
* )
|
|
353
|
+
* sql`(select pet.id from pet where person.id = pet.owner_id and pet.name = ${petName})`
|
|
350
354
|
* )
|
|
351
355
|
* ```
|
|
352
356
|
*
|
|
@@ -29,9 +29,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
29
29
|
}
|
|
30
30
|
visitSelectQuery(node) {
|
|
31
31
|
const wrapInParens = this.parentNode !== undefined &&
|
|
32
|
+
!insert_query_node_js_1.InsertQueryNode.is(this.parentNode) &&
|
|
32
33
|
!create_view_node_js_1.CreateViewNode.is(this.parentNode) &&
|
|
33
|
-
!union_node_js_1.UnionNode.is(this.parentNode)
|
|
34
|
-
!insert_query_node_js_1.InsertQueryNode.is(this.parentNode);
|
|
34
|
+
!union_node_js_1.UnionNode.is(this.parentNode);
|
|
35
35
|
if (wrapInParens) {
|
|
36
36
|
this.append('(');
|
|
37
37
|
}
|
|
@@ -190,6 +190,14 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
190
190
|
this.append(' ');
|
|
191
191
|
this.visitNode(node.where);
|
|
192
192
|
}
|
|
193
|
+
if (node.orderBy) {
|
|
194
|
+
this.append(' ');
|
|
195
|
+
this.visitNode(node.orderBy);
|
|
196
|
+
}
|
|
197
|
+
if (node.limit) {
|
|
198
|
+
this.append(' ');
|
|
199
|
+
this.visitNode(node.limit);
|
|
200
|
+
}
|
|
193
201
|
if (node.returning) {
|
|
194
202
|
this.append(' ');
|
|
195
203
|
this.visitNode(node.returning);
|
|
@@ -285,12 +293,13 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
285
293
|
this.visitNode(node.on);
|
|
286
294
|
}
|
|
287
295
|
visitRaw(node) {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
296
|
+
const { sqlFragments, parameters: params } = node;
|
|
297
|
+
for (let i = 0; i < sqlFragments.length; ++i) {
|
|
298
|
+
this.append(sqlFragments[i]);
|
|
299
|
+
if (params.length > i) {
|
|
300
|
+
this.visitNode(params[i]);
|
|
292
301
|
}
|
|
293
|
-
}
|
|
302
|
+
}
|
|
294
303
|
}
|
|
295
304
|
visitOperator(node) {
|
|
296
305
|
this.append(node.operator);
|
|
@@ -4,10 +4,8 @@ import { DeleteQueryBuilder } from './query-builder/delete-query-builder.js';
|
|
|
4
4
|
import { UpdateQueryBuilder } from './query-builder/update-query-builder.js';
|
|
5
5
|
import { TableExpression, TableExpressionDatabase, TableExpressionTables, TableReference } from './parser/table-parser.js';
|
|
6
6
|
import { QueryExecutor } from './query-executor/query-executor.js';
|
|
7
|
-
import { RawBuilder } from './raw-builder/raw-builder.js';
|
|
8
7
|
import { CommonTableExpression, QueryCreatorWithCommonTableExpression, RecursiveCommonTableExpression } from './parser/with-parser.js';
|
|
9
8
|
import { WithNode } from './operation-node/with-node.js';
|
|
10
|
-
import { ParseContext } from './parser/parse-context.js';
|
|
11
9
|
import { InsertResult } from './query-builder/insert-result.js';
|
|
12
10
|
import { DeleteResult } from './query-builder/delete-result.js';
|
|
13
11
|
import { UpdateResult } from './query-builder/update-result.js';
|
|
@@ -73,9 +71,10 @@ export declare class QueryCreator<DB> {
|
|
|
73
71
|
* Create a select query from raw sql:
|
|
74
72
|
*
|
|
75
73
|
* ```ts
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
74
|
+
* import { sql } from 'kysely'
|
|
75
|
+
*
|
|
76
|
+
* const items = await db
|
|
77
|
+
* .selectFrom(sql<{ one: number }>`(select 1 as one)`.as('q'))
|
|
79
78
|
* .select('q.one')
|
|
80
79
|
* .execute()
|
|
81
80
|
*
|
|
@@ -91,18 +90,20 @@ export declare class QueryCreator<DB> {
|
|
|
91
90
|
* ) as q
|
|
92
91
|
* ```
|
|
93
92
|
*
|
|
94
|
-
* When you use `
|
|
95
|
-
* raw
|
|
96
|
-
* available for the query.
|
|
93
|
+
* When you use the `sql` tag you need to also provide the result type of the
|
|
94
|
+
* raw snippet / query so that Kysely can figure out what columns are
|
|
95
|
+
* available for the rest of the query.
|
|
97
96
|
*
|
|
98
97
|
* The `selectFrom` method also accepts an array for multiple tables. All
|
|
99
98
|
* the above examples can also be used in an array.
|
|
100
99
|
*
|
|
101
100
|
* ```ts
|
|
101
|
+
* import { sql } from 'kysely'
|
|
102
|
+
*
|
|
102
103
|
* const items = await db.selectFrom([
|
|
103
104
|
* 'person as p',
|
|
104
105
|
* db.selectFrom('pet').select('pet.species').as('a'),
|
|
105
|
-
*
|
|
106
|
+
* sql<{ one: number }>`(select 1 as one)`.as('q')
|
|
106
107
|
* ])
|
|
107
108
|
* .select(['p.id', 'a.species', 'q.one'])
|
|
108
109
|
* .execute()
|
|
@@ -258,14 +259,18 @@ export declare class QueryCreator<DB> {
|
|
|
258
259
|
* This only affects the query created through the builder returned from
|
|
259
260
|
* this method and doesn't modify the `db` instance.
|
|
260
261
|
*
|
|
262
|
+
* See [this recipe](https://github.com/koskimas/kysely/tree/master/recipes/schemas.md)
|
|
263
|
+
* for a more detailed explanation.
|
|
264
|
+
*
|
|
261
265
|
* ### Examples
|
|
262
266
|
*
|
|
263
267
|
* ```
|
|
264
|
-
* await db
|
|
265
|
-
*
|
|
266
|
-
*
|
|
267
|
-
*
|
|
268
|
-
*
|
|
268
|
+
* await db
|
|
269
|
+
* .withSchema('mammals')
|
|
270
|
+
* .selectFrom('pet')
|
|
271
|
+
* .selectAll()
|
|
272
|
+
* .innerJoin('public.person', 'public.person.id', 'pet.owner_id')
|
|
273
|
+
* .execute()
|
|
269
274
|
* ```
|
|
270
275
|
*
|
|
271
276
|
* The generated SQL (PostgreSQL):
|
|
@@ -281,10 +286,11 @@ export declare class QueryCreator<DB> {
|
|
|
281
286
|
* doesn't belong to:
|
|
282
287
|
*
|
|
283
288
|
* ```
|
|
284
|
-
* await db
|
|
285
|
-
*
|
|
286
|
-
*
|
|
287
|
-
*
|
|
289
|
+
* await db
|
|
290
|
+
* .withSchema('mammals')
|
|
291
|
+
* .selectFrom('pet as p')
|
|
292
|
+
* .select('p.name')
|
|
293
|
+
* .execute()
|
|
288
294
|
* ```
|
|
289
295
|
*
|
|
290
296
|
* The generated SQL (PostgreSQL):
|
|
@@ -294,128 +300,8 @@ export declare class QueryCreator<DB> {
|
|
|
294
300
|
* ```
|
|
295
301
|
*/
|
|
296
302
|
withSchema(schema: string): QueryCreator<DB>;
|
|
297
|
-
/**
|
|
298
|
-
* Provides a way to pass arbitrary SQL into your query and executing completely
|
|
299
|
-
* raw queries.
|
|
300
|
-
*
|
|
301
|
-
* You can use the strings `?` and `??` in the `sql` to bind parameters such as
|
|
302
|
-
* user input to the SQL. You should never EVER concatenate untrusted user
|
|
303
|
-
* input to the SQL string to avoid injection vulnerabilities. Instead use `?`
|
|
304
|
-
* in place of a value and pass the actual value in the `parameters` list. See
|
|
305
|
-
* the examples below.
|
|
306
|
-
*
|
|
307
|
-
* You should only use `raw` when there is no other way to get the job done. This is
|
|
308
|
-
* because Kysely is not able to use type inference when you use raw SQL. For example
|
|
309
|
-
* Kysely won't be able to automatically provide you with the correct query result
|
|
310
|
-
* type. However, there are ways to manually provide types when you use `raw` in most
|
|
311
|
-
* cases. See the examples below.
|
|
312
|
-
*
|
|
313
|
-
* Raw builder instances can be passed to pretty much anywhere: `select`, `where`,
|
|
314
|
-
* `*Join`, `groupBy`, `orderBy` etc. Just try it. If the method accepts it, it works.
|
|
315
|
-
*
|
|
316
|
-
* ### Examples
|
|
317
|
-
*
|
|
318
|
-
* Example of using `raw` in a select statement:
|
|
319
|
-
*
|
|
320
|
-
* ```ts
|
|
321
|
-
* const [person] = await db.selectFrom('person')
|
|
322
|
-
* .select(db.raw<string>('concat(first_name, ' ', last_name)').as('name'))
|
|
323
|
-
* .where('id', '=', 1)
|
|
324
|
-
* .execute()
|
|
325
|
-
*
|
|
326
|
-
* console.log(person.name)
|
|
327
|
-
* ```
|
|
328
|
-
*
|
|
329
|
-
* The generated SQL (PostgreSQL):
|
|
330
|
-
*
|
|
331
|
-
* ```sql
|
|
332
|
-
* select concat(first_name, ' ', last_name) as "name"
|
|
333
|
-
* from "person" where "id" = 1
|
|
334
|
-
* ```
|
|
335
|
-
*
|
|
336
|
-
* The above example selects computed column `name` by concatenating the first name
|
|
337
|
-
* and last name together.
|
|
338
|
-
*
|
|
339
|
-
* There are couple of things worth noticing:
|
|
340
|
-
*
|
|
341
|
-
* 1. You need to provide the output type of your SQL segment for the `raw` method
|
|
342
|
-
* so that Kysely knows what type to give for the `name` column. In this case it's
|
|
343
|
-
* a `string` since that's the output type of the `concat` function in SQL.
|
|
344
|
-
*
|
|
345
|
-
* 2. You need to give an alias for the selection using the `as` method so that
|
|
346
|
-
* Kysely is able to add a column to the output type. The alias needs to be
|
|
347
|
-
* known at compile time! If you pass a string variable whose value is not known
|
|
348
|
-
* at compile time, there is no way for Kysely or typescript to add a column to
|
|
349
|
-
* the output type. In this case you need to use the `castTo` method on the query
|
|
350
|
-
* to specify a return type for the query.
|
|
351
|
-
*
|
|
352
|
-
* We could've also used a `??` placeholder to provide `first_name` and `last_name` like
|
|
353
|
-
* this:
|
|
354
|
-
*
|
|
355
|
-
* ```ts
|
|
356
|
-
* db.raw<string>('concat(??, ' ', ??)', ['first_name', 'last_name'])
|
|
357
|
-
* ```
|
|
358
|
-
*
|
|
359
|
-
* or this:
|
|
360
|
-
*
|
|
361
|
-
* ```ts
|
|
362
|
-
* db.raw<string>('concat(??, ' ', ??)', ['person.first_name', 'person.last_name'])
|
|
363
|
-
* ```
|
|
364
|
-
*
|
|
365
|
-
* But it's often cleaner to just write the column names in the SQL. Again remember to
|
|
366
|
-
* never concatenate column names or any other untrusted user input to the SQL string or you
|
|
367
|
-
* are going to create an injection vulnerability. All user input should go to the parameters
|
|
368
|
-
* array, never to the SQL string directly. But if the column names or values are trusted
|
|
369
|
-
* and known at compile time, there is no reason to use parameters.
|
|
370
|
-
*
|
|
371
|
-
* Example of using `raw` in `where`:
|
|
372
|
-
*
|
|
373
|
-
* ```ts
|
|
374
|
-
* function getPersonsOlderThan(ageLimit: number) {
|
|
375
|
-
* return await db.selectFrom('person')
|
|
376
|
-
* .selectAll()
|
|
377
|
-
* .where(
|
|
378
|
-
* db.raw('now() - birth_date'),
|
|
379
|
-
* '>',
|
|
380
|
-
* db.raw('interval ? year', [ageLimit.toString()])
|
|
381
|
-
* )
|
|
382
|
-
* .execute()
|
|
383
|
-
* }
|
|
384
|
-
* ```
|
|
385
|
-
*
|
|
386
|
-
* The generated SQL (PostgreSQL):
|
|
387
|
-
*
|
|
388
|
-
* ```sql
|
|
389
|
-
* select * from "person" where now() - birth_date > interval $1 year
|
|
390
|
-
* ```
|
|
391
|
-
*
|
|
392
|
-
* The function in the above example returns people that are older than the given number of
|
|
393
|
-
* years. The number of years in this example is an untrusted user input, and therefore we use
|
|
394
|
-
* a `?` placeholder for it.
|
|
395
|
-
*
|
|
396
|
-
* Example of creating a completely raw query from scratch:
|
|
397
|
-
*
|
|
398
|
-
* ```ts
|
|
399
|
-
* const result = await db.raw<Person>('select p.* from person p').execute()
|
|
400
|
-
* const persons = result.rows
|
|
401
|
-
* ```
|
|
402
|
-
*
|
|
403
|
-
* For a raw query, you need to specify the type of the returned __row__. In
|
|
404
|
-
* this case we know the resulting items will be of type `Person` se specify that.
|
|
405
|
-
* The result of `execute()` method is always an array. In this case the type of
|
|
406
|
-
* the `persons` variable is `Person[]`.
|
|
407
|
-
*
|
|
408
|
-
* @param sql - The raw SQL. Special strings `?` and `??` can be used as parameter
|
|
409
|
-
* placeholders. `?` for values and `??` for identifiers such as column names
|
|
410
|
-
* or `column.table` references.
|
|
411
|
-
*
|
|
412
|
-
* @param params - The parameters that will be bound to the `?` and `??` placeholders in
|
|
413
|
-
* the sql string.
|
|
414
|
-
*/
|
|
415
|
-
raw<T = unknown>(sql: string, parameters?: unknown[]): RawBuilder<T>;
|
|
416
303
|
}
|
|
417
304
|
export interface QueryCreatorProps {
|
|
418
305
|
readonly executor: QueryExecutor;
|
|
419
|
-
readonly parseContext: ParseContext;
|
|
420
306
|
readonly withNode?: WithNode;
|
|
421
307
|
}
|