kysely 0.27.3 → 0.27.5
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/.renovaterc.json +3 -0
- package/CONTRIBUTING.md +2 -2
- package/README.md +7 -7
- package/deno.check.d.ts +86 -0
- package/deno.check.json +21 -0
- package/dist/cjs/dialect/dialect-adapter-base.d.ts +13 -3
- package/dist/cjs/dialect/dialect-adapter-base.js +4 -1
- package/dist/cjs/dialect/dialect-adapter.d.ts +16 -2
- package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +12 -7
- package/dist/cjs/dialect/mssql/mssql-adapter.js +2 -4
- package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +83 -55
- package/dist/cjs/dialect/mssql/mssql-driver.d.ts +1 -0
- package/dist/cjs/dialect/mssql/mssql-driver.js +114 -48
- package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +11 -2
- package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +4 -0
- package/dist/cjs/dialect/mysql/mysql-driver.js +3 -0
- package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +11 -2
- package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +10 -3
- package/dist/cjs/dialect/postgres/postgres-driver.js +3 -0
- package/dist/cjs/dialect/postgres/postgres-introspector.js +5 -1
- package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +11 -2
- package/dist/cjs/driver/database-connection.d.ts +3 -1
- package/dist/cjs/driver/dummy-driver.d.ts +13 -12
- package/dist/cjs/driver/dummy-driver.js +13 -12
- package/dist/cjs/dynamic/dynamic-reference-builder.js +2 -2
- package/dist/cjs/dynamic/dynamic.d.ts +7 -7
- package/dist/cjs/dynamic/dynamic.js +7 -7
- package/dist/cjs/expression/expression-builder.d.ts +153 -62
- package/dist/cjs/expression/expression-builder.js +2 -3
- package/dist/cjs/expression/expression-wrapper.d.ts +92 -23
- package/dist/cjs/expression/expression.d.ts +40 -5
- package/dist/cjs/expression/expression.js +2 -3
- package/dist/cjs/helpers/mssql.d.ts +74 -14
- package/dist/cjs/helpers/mssql.js +77 -18
- package/dist/cjs/helpers/mysql.d.ts +17 -13
- package/dist/cjs/helpers/mysql.js +20 -17
- package/dist/cjs/helpers/postgres.d.ts +11 -8
- package/dist/cjs/helpers/postgres.js +14 -12
- package/dist/cjs/helpers/sqlite.d.ts +41 -16
- package/dist/cjs/helpers/sqlite.js +44 -20
- package/dist/cjs/index.d.ts +28 -21
- package/dist/cjs/index.js +28 -21
- package/dist/cjs/kysely.d.ts +100 -42
- package/dist/cjs/kysely.js +63 -39
- package/dist/cjs/migration/file-migration-provider.d.ts +2 -2
- package/dist/cjs/migration/file-migration-provider.js +2 -2
- package/dist/cjs/migration/migrator.d.ts +82 -14
- package/dist/cjs/migration/migrator.js +82 -14
- package/dist/cjs/operation-node/aggregate-function-node.d.ts +4 -0
- package/dist/cjs/operation-node/aggregate-function-node.js +9 -0
- package/dist/cjs/operation-node/alter-column-node.d.ts +1 -1
- package/dist/cjs/operation-node/case-node.d.ts +1 -1
- package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
- package/dist/cjs/operation-node/data-type-node.d.ts +2 -2
- package/dist/cjs/operation-node/data-type-node.js +17 -3
- package/dist/cjs/operation-node/delete-query-node.d.ts +3 -0
- package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +4 -4
- package/dist/cjs/operation-node/having-node.d.ts +1 -1
- package/dist/cjs/operation-node/insert-query-node.d.ts +3 -0
- package/dist/cjs/operation-node/merge-query-node.d.ts +3 -0
- package/dist/cjs/operation-node/on-node.d.ts +1 -1
- package/dist/cjs/operation-node/operation-node-source.js +1 -2
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +11 -3
- package/dist/cjs/operation-node/operation-node-transformer.js +26 -3
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/operator-node.d.ts +3 -3
- package/dist/cjs/operation-node/operator-node.js +8 -6
- package/dist/cjs/operation-node/output-node.d.ts +13 -0
- package/dist/cjs/operation-node/output-node.js +26 -0
- package/dist/cjs/operation-node/query-node.d.ts +15 -6
- package/dist/cjs/operation-node/query-node.js +17 -0
- package/dist/cjs/operation-node/select-query-node.d.ts +1 -1
- package/dist/cjs/operation-node/select-query-node.js +6 -8
- package/dist/cjs/operation-node/update-query-node.d.ts +3 -0
- package/dist/cjs/operation-node/where-node.d.ts +1 -1
- package/dist/cjs/parser/binary-operation-parser.js +5 -6
- package/dist/cjs/parser/data-type-parser.js +1 -2
- package/dist/cjs/parser/default-value-parser.js +1 -2
- package/dist/cjs/parser/expression-parser.js +3 -4
- package/dist/cjs/parser/fetch-parser.js +1 -2
- package/dist/cjs/parser/group-by-parser.js +1 -2
- package/dist/cjs/parser/identifier-parser.js +1 -2
- package/dist/cjs/parser/insert-values-parser.js +1 -2
- package/dist/cjs/parser/join-parser.js +1 -2
- package/dist/cjs/parser/merge-parser.js +2 -3
- package/dist/cjs/parser/on-commit-action-parse.js +1 -2
- package/dist/cjs/parser/on-modify-action-parser.js +1 -2
- package/dist/cjs/parser/order-by-parser.js +3 -4
- package/dist/cjs/parser/parse-utils.js +4 -5
- package/dist/cjs/parser/partition-by-parser.js +1 -2
- package/dist/cjs/parser/reference-parser.js +8 -9
- package/dist/cjs/parser/returning-parser.d.ts +4 -3
- package/dist/cjs/parser/select-parser.js +2 -3
- package/dist/cjs/parser/set-operation-parser.js +1 -2
- package/dist/cjs/parser/table-parser.js +4 -5
- package/dist/cjs/parser/top-parser.js +1 -2
- package/dist/cjs/parser/unary-operation-parser.js +3 -4
- package/dist/cjs/parser/update-set-parser.js +2 -3
- package/dist/cjs/parser/value-parser.js +4 -5
- package/dist/cjs/parser/with-parser.js +1 -2
- package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +54 -27
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +26 -21
- package/dist/cjs/plugin/camel-case/camel-case.js +2 -3
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +29 -7
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.js +2 -2
- package/dist/cjs/plugin/immediate-value/immediate-value-plugin.d.ts +28 -6
- package/dist/cjs/plugin/kysely-plugin.d.ts +28 -6
- package/dist/cjs/plugin/noop-plugin.d.ts +28 -6
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +80 -9
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +53 -14
- package/dist/cjs/plugin/with-schema/with-schema-plugin.d.ts +28 -6
- package/dist/cjs/query-builder/aggregate-function-builder.d.ts +43 -1
- package/dist/cjs/query-builder/aggregate-function-builder.js +30 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +219 -43
- package/dist/cjs/query-builder/delete-query-builder.js +95 -31
- package/dist/cjs/query-builder/function-module.d.ts +40 -93
- package/dist/cjs/query-builder/function-module.js +1 -2
- package/dist/cjs/query-builder/insert-query-builder.d.ts +326 -67
- package/dist/cjs/query-builder/insert-query-builder.js +212 -61
- package/dist/cjs/query-builder/insert-result.d.ts +10 -5
- package/dist/cjs/query-builder/insert-result.js +10 -5
- package/dist/cjs/query-builder/json-path-builder.d.ts +33 -9
- package/dist/cjs/query-builder/json-path-builder.js +8 -5
- package/dist/cjs/query-builder/merge-query-builder.d.ts +312 -10
- package/dist/cjs/query-builder/merge-query-builder.js +98 -7
- package/dist/cjs/query-builder/no-result-error.js +2 -2
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +53 -20
- package/dist/cjs/query-builder/on-conflict-builder.js +41 -16
- package/dist/cjs/query-builder/output-interface.d.ts +138 -0
- package/dist/cjs/query-builder/output-interface.js +2 -0
- package/dist/cjs/query-builder/returning-interface.d.ts +7 -5
- package/dist/cjs/query-builder/select-query-builder-expression.d.ts +8 -0
- package/dist/cjs/query-builder/select-query-builder.d.ts +370 -73
- package/dist/cjs/query-builder/select-query-builder.js +14 -9
- package/dist/cjs/query-builder/update-query-builder.d.ts +225 -31
- package/dist/cjs/query-builder/update-query-builder.js +96 -17
- package/dist/cjs/query-builder/update-result.d.ts +9 -0
- package/dist/cjs/query-builder/update-result.js +9 -0
- package/dist/cjs/query-builder/where-interface.d.ts +6 -2
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +45 -1
- package/dist/cjs/query-creator.d.ts +122 -21
- package/dist/cjs/query-creator.js +56 -3
- package/dist/cjs/raw-builder/raw-builder.d.ts +29 -7
- package/dist/cjs/raw-builder/raw-builder.js +1 -2
- package/dist/cjs/raw-builder/sql.d.ts +31 -12
- package/dist/cjs/schema/alter-column-builder.d.ts +17 -3
- package/dist/cjs/schema/alter-column-builder.js +20 -3
- package/dist/cjs/schema/alter-table-add-index-builder.d.ts +44 -10
- package/dist/cjs/schema/alter-table-add-index-builder.js +27 -10
- package/dist/cjs/schema/alter-table-builder.js +1 -2
- package/dist/cjs/schema/column-definition-builder.d.ts +286 -24
- package/dist/cjs/schema/column-definition-builder.js +288 -24
- package/dist/cjs/schema/create-table-builder.d.ts +86 -33
- package/dist/cjs/schema/create-table-builder.js +86 -33
- package/dist/cjs/util/assert.js +2 -3
- package/dist/cjs/util/column-type.d.ts +5 -9
- package/dist/cjs/util/compilable.js +1 -2
- package/dist/cjs/util/json-object-args.js +1 -2
- package/dist/cjs/util/log-once.js +1 -2
- package/dist/cjs/util/object-utils.js +38 -26
- package/dist/cjs/util/performance-now.js +1 -2
- package/dist/cjs/util/prevent-await.js +1 -2
- package/dist/cjs/util/query-id.js +1 -2
- package/dist/cjs/util/random-string.js +1 -2
- package/dist/cjs/util/require-all-props.d.ts +4 -2
- package/dist/cjs/util/require-all-props.js +5 -4
- package/dist/cjs/util/stack-trace-utils.js +1 -2
- package/dist/cjs/util/streamable.d.ts +1 -1
- package/dist/cjs/util/type-utils.d.ts +4 -2
- package/dist/esm/dialect/dialect-adapter-base.d.ts +13 -3
- package/dist/esm/dialect/dialect-adapter-base.js +4 -1
- package/dist/esm/dialect/dialect-adapter.d.ts +16 -2
- package/dist/esm/dialect/mssql/mssql-adapter.d.ts +12 -7
- package/dist/esm/dialect/mssql/mssql-adapter.js +2 -4
- package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +83 -55
- package/dist/esm/dialect/mssql/mssql-driver.d.ts +1 -0
- package/dist/esm/dialect/mssql/mssql-driver.js +114 -48
- package/dist/esm/dialect/mysql/mysql-adapter.d.ts +11 -2
- package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +4 -0
- package/dist/esm/dialect/mysql/mysql-driver.js +3 -0
- package/dist/esm/dialect/postgres/postgres-adapter.d.ts +11 -2
- package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +10 -3
- package/dist/esm/dialect/postgres/postgres-driver.js +3 -0
- package/dist/esm/dialect/postgres/postgres-introspector.js +5 -1
- package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +11 -2
- package/dist/esm/driver/database-connection.d.ts +3 -1
- package/dist/esm/driver/dummy-driver.d.ts +13 -12
- package/dist/esm/driver/dummy-driver.js +13 -12
- package/dist/esm/dynamic/dynamic.d.ts +7 -7
- package/dist/esm/dynamic/dynamic.js +7 -7
- package/dist/esm/expression/expression-builder.d.ts +153 -62
- package/dist/esm/expression/expression-wrapper.d.ts +92 -23
- package/dist/esm/expression/expression.d.ts +40 -5
- package/dist/esm/helpers/mssql.d.ts +74 -14
- package/dist/esm/helpers/mssql.js +74 -14
- package/dist/esm/helpers/mysql.d.ts +17 -13
- package/dist/esm/helpers/mysql.js +17 -13
- package/dist/esm/helpers/postgres.d.ts +11 -8
- package/dist/esm/helpers/postgres.js +11 -8
- package/dist/esm/helpers/sqlite.d.ts +41 -16
- package/dist/esm/helpers/sqlite.js +41 -16
- package/dist/esm/index.d.ts +28 -21
- package/dist/esm/index.js +28 -21
- package/dist/esm/kysely.d.ts +100 -42
- package/dist/esm/kysely.js +61 -37
- package/dist/esm/migration/file-migration-provider.d.ts +2 -2
- package/dist/esm/migration/file-migration-provider.js +2 -2
- package/dist/esm/migration/migrator.d.ts +82 -14
- package/dist/esm/migration/migrator.js +82 -14
- package/dist/esm/operation-node/aggregate-function-node.d.ts +4 -0
- package/dist/esm/operation-node/aggregate-function-node.js +9 -0
- package/dist/esm/operation-node/alter-column-node.d.ts +1 -1
- package/dist/esm/operation-node/case-node.d.ts +1 -1
- package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
- package/dist/esm/operation-node/data-type-node.d.ts +2 -2
- package/dist/esm/operation-node/data-type-node.js +15 -1
- package/dist/esm/operation-node/delete-query-node.d.ts +3 -0
- package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +4 -4
- package/dist/esm/operation-node/having-node.d.ts +1 -1
- package/dist/esm/operation-node/insert-query-node.d.ts +3 -0
- package/dist/esm/operation-node/merge-query-node.d.ts +3 -0
- package/dist/esm/operation-node/on-node.d.ts +1 -1
- package/dist/esm/operation-node/operation-node-transformer.d.ts +11 -3
- package/dist/esm/operation-node/operation-node-transformer.js +26 -3
- package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-visitor.js +1 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/operator-node.d.ts +3 -3
- package/dist/esm/operation-node/operator-node.js +2 -0
- package/dist/esm/operation-node/output-node.d.ts +13 -0
- package/dist/esm/operation-node/output-node.js +24 -0
- package/dist/esm/operation-node/query-node.d.ts +15 -6
- package/dist/esm/operation-node/query-node.js +17 -0
- package/dist/esm/operation-node/select-query-node.d.ts +1 -1
- package/dist/esm/operation-node/select-query-node.js +6 -8
- package/dist/esm/operation-node/update-query-node.d.ts +3 -0
- package/dist/esm/operation-node/where-node.d.ts +1 -1
- package/dist/esm/parser/returning-parser.d.ts +4 -3
- package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +54 -27
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +26 -21
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +29 -7
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.js +2 -2
- package/dist/esm/plugin/immediate-value/immediate-value-plugin.d.ts +28 -6
- package/dist/esm/plugin/kysely-plugin.d.ts +28 -6
- package/dist/esm/plugin/noop-plugin.d.ts +28 -6
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +80 -9
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +53 -14
- package/dist/esm/plugin/with-schema/with-schema-plugin.d.ts +28 -6
- package/dist/esm/query-builder/aggregate-function-builder.d.ts +43 -1
- package/dist/esm/query-builder/aggregate-function-builder.js +30 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +219 -43
- package/dist/esm/query-builder/delete-query-builder.js +95 -31
- package/dist/esm/query-builder/function-module.d.ts +40 -93
- package/dist/esm/query-builder/insert-query-builder.d.ts +326 -67
- package/dist/esm/query-builder/insert-query-builder.js +212 -61
- package/dist/esm/query-builder/insert-result.d.ts +10 -5
- package/dist/esm/query-builder/insert-result.js +10 -5
- package/dist/esm/query-builder/json-path-builder.d.ts +33 -9
- package/dist/esm/query-builder/json-path-builder.js +8 -5
- package/dist/esm/query-builder/merge-query-builder.d.ts +312 -10
- package/dist/esm/query-builder/merge-query-builder.js +98 -7
- package/dist/esm/query-builder/on-conflict-builder.d.ts +53 -20
- package/dist/esm/query-builder/on-conflict-builder.js +41 -16
- package/dist/esm/query-builder/output-interface.d.ts +138 -0
- package/dist/esm/query-builder/output-interface.js +2 -0
- package/dist/esm/query-builder/returning-interface.d.ts +7 -5
- package/dist/esm/query-builder/select-query-builder-expression.d.ts +8 -0
- package/dist/esm/query-builder/select-query-builder.d.ts +370 -73
- package/dist/esm/query-builder/select-query-builder.js +13 -7
- package/dist/esm/query-builder/update-query-builder.d.ts +225 -31
- package/dist/esm/query-builder/update-query-builder.js +96 -17
- package/dist/esm/query-builder/update-result.d.ts +9 -0
- package/dist/esm/query-builder/update-result.js +9 -0
- package/dist/esm/query-builder/where-interface.d.ts +6 -2
- package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
- package/dist/esm/query-compiler/default-query-compiler.js +45 -1
- package/dist/esm/query-creator.d.ts +122 -21
- package/dist/esm/query-creator.js +56 -3
- package/dist/esm/raw-builder/raw-builder.d.ts +29 -7
- package/dist/esm/raw-builder/sql.d.ts +31 -12
- package/dist/esm/schema/alter-column-builder.d.ts +17 -3
- package/dist/esm/schema/alter-column-builder.js +20 -3
- package/dist/esm/schema/alter-table-add-index-builder.d.ts +44 -10
- package/dist/esm/schema/alter-table-add-index-builder.js +27 -10
- package/dist/esm/schema/alter-table-builder.js +1 -2
- package/dist/esm/schema/column-definition-builder.d.ts +286 -24
- package/dist/esm/schema/column-definition-builder.js +288 -24
- package/dist/esm/schema/create-table-builder.d.ts +86 -33
- package/dist/esm/schema/create-table-builder.js +86 -33
- package/dist/esm/util/column-type.d.ts +5 -9
- package/dist/esm/util/object-utils.js +18 -5
- package/dist/esm/util/require-all-props.d.ts +4 -2
- package/dist/esm/util/require-all-props.js +4 -2
- package/dist/esm/util/streamable.d.ts +1 -1
- package/dist/esm/util/type-utils.d.ts +4 -2
- package/package.json +30 -24
|
@@ -121,15 +121,17 @@ class UpdateQueryBuilder {
|
|
|
121
121
|
* Update the first 2 rows in the 'person' table:
|
|
122
122
|
*
|
|
123
123
|
* ```ts
|
|
124
|
-
*
|
|
124
|
+
* await db
|
|
125
125
|
* .updateTable('person')
|
|
126
126
|
* .set({ first_name: 'Foo' })
|
|
127
|
-
* .limit(2)
|
|
127
|
+
* .limit(2)
|
|
128
|
+
* .execute()
|
|
128
129
|
* ```
|
|
129
130
|
*
|
|
130
131
|
* The generated SQL (MySQL):
|
|
132
|
+
*
|
|
131
133
|
* ```sql
|
|
132
|
-
* update `person` set `first_name` =
|
|
134
|
+
* update `person` set `first_name` = ? limit ?
|
|
133
135
|
* ```
|
|
134
136
|
*/
|
|
135
137
|
limit(limit) {
|
|
@@ -150,10 +152,51 @@ class UpdateQueryBuilder {
|
|
|
150
152
|
queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(selection)),
|
|
151
153
|
});
|
|
152
154
|
}
|
|
153
|
-
returningAll() {
|
|
155
|
+
returningAll(table) {
|
|
156
|
+
return new UpdateQueryBuilder({
|
|
157
|
+
...this.#props,
|
|
158
|
+
queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
output(args) {
|
|
162
|
+
return new UpdateQueryBuilder({
|
|
163
|
+
...this.#props,
|
|
164
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(args)),
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
outputAll(table) {
|
|
168
|
+
return new UpdateQueryBuilder({
|
|
169
|
+
...this.#props,
|
|
170
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* This can be used to add any additional SQL to the end of the query.
|
|
175
|
+
*
|
|
176
|
+
* ### Examples
|
|
177
|
+
*
|
|
178
|
+
* ```ts
|
|
179
|
+
* import { sql } from 'kysely'
|
|
180
|
+
*
|
|
181
|
+
* await db.updateTable('person')
|
|
182
|
+
* .set({ age: 39 })
|
|
183
|
+
* .where('first_name', '=', 'John')
|
|
184
|
+
* .modifyEnd(sql.raw('-- This is a comment'))
|
|
185
|
+
* .execute()
|
|
186
|
+
* ```
|
|
187
|
+
*
|
|
188
|
+
* The generated SQL (MySQL):
|
|
189
|
+
*
|
|
190
|
+
* ```sql
|
|
191
|
+
* update `person`
|
|
192
|
+
* set `age` = 39
|
|
193
|
+
* where `first_name` = "John" -- This is a comment
|
|
194
|
+
* ```
|
|
195
|
+
*/
|
|
196
|
+
modifyEnd(modifier) {
|
|
154
197
|
return new UpdateQueryBuilder({
|
|
155
198
|
...this.#props,
|
|
156
|
-
queryNode: query_node_js_1.QueryNode.
|
|
199
|
+
queryNode: query_node_js_1.QueryNode.cloneWithEndModifier(this.#props.queryNode, modifier.toOperationNode()),
|
|
157
200
|
});
|
|
158
201
|
}
|
|
159
202
|
/**
|
|
@@ -193,11 +236,18 @@ class UpdateQueryBuilder {
|
|
|
193
236
|
* The next example uses a helper function `log` to log a query:
|
|
194
237
|
*
|
|
195
238
|
* ```ts
|
|
239
|
+
* import type { Compilable } from 'kysely'
|
|
240
|
+
* import type { PersonUpdate } from 'type-editor' // imaginary module
|
|
241
|
+
*
|
|
196
242
|
* function log<T extends Compilable>(qb: T): T {
|
|
197
243
|
* console.log(qb.compile())
|
|
198
244
|
* return qb
|
|
199
245
|
* }
|
|
200
246
|
*
|
|
247
|
+
* const values = {
|
|
248
|
+
* first_name: 'John',
|
|
249
|
+
* } satisfies PersonUpdate
|
|
250
|
+
*
|
|
201
251
|
* db.updateTable('person')
|
|
202
252
|
* .set(values)
|
|
203
253
|
* .$call(log)
|
|
@@ -220,7 +270,9 @@ class UpdateQueryBuilder {
|
|
|
220
270
|
* ### Examples
|
|
221
271
|
*
|
|
222
272
|
* ```ts
|
|
223
|
-
*
|
|
273
|
+
* import type { PersonUpdate } from 'type-editor' // imaginary module
|
|
274
|
+
*
|
|
275
|
+
* async function updatePerson(id: number, updates: PersonUpdate, returnLastName: boolean) {
|
|
224
276
|
* return await db
|
|
225
277
|
* .updateTable('person')
|
|
226
278
|
* .set(updates)
|
|
@@ -236,11 +288,11 @@ class UpdateQueryBuilder {
|
|
|
236
288
|
* the code. In the example above the return type of the `updatePerson` function is:
|
|
237
289
|
*
|
|
238
290
|
* ```ts
|
|
239
|
-
* {
|
|
291
|
+
* Promise<{
|
|
240
292
|
* id: number
|
|
241
293
|
* first_name: string
|
|
242
294
|
* last_name?: string
|
|
243
|
-
* }
|
|
295
|
+
* }>
|
|
244
296
|
* ```
|
|
245
297
|
*/
|
|
246
298
|
$if(condition, func) {
|
|
@@ -278,27 +330,41 @@ class UpdateQueryBuilder {
|
|
|
278
330
|
* Turn this code:
|
|
279
331
|
*
|
|
280
332
|
* ```ts
|
|
333
|
+
* import type { Person } from 'type-editor' // imaginary module
|
|
334
|
+
*
|
|
335
|
+
* const id = 1
|
|
336
|
+
* const now = new Date().toISOString()
|
|
337
|
+
*
|
|
281
338
|
* const person = await db.updateTable('person')
|
|
282
|
-
* .set({
|
|
339
|
+
* .set({ deleted_at: now })
|
|
283
340
|
* .where('id', '=', id)
|
|
284
341
|
* .where('nullable_column', 'is not', null)
|
|
285
342
|
* .returningAll()
|
|
286
343
|
* .executeTakeFirstOrThrow()
|
|
287
344
|
*
|
|
288
|
-
* if (person
|
|
345
|
+
* if (isWithNoNullValue(person)) {
|
|
289
346
|
* functionThatExpectsPersonWithNonNullValue(person)
|
|
290
347
|
* }
|
|
348
|
+
*
|
|
349
|
+
* function isWithNoNullValue(person: Person): person is Person & { nullable_column: string } {
|
|
350
|
+
* return person.nullable_column != null
|
|
351
|
+
* }
|
|
291
352
|
* ```
|
|
292
353
|
*
|
|
293
354
|
* Into this:
|
|
294
355
|
*
|
|
295
356
|
* ```ts
|
|
357
|
+
* import type { NotNull } from 'kysely'
|
|
358
|
+
*
|
|
359
|
+
* const id = 1
|
|
360
|
+
* const now = new Date().toISOString()
|
|
361
|
+
*
|
|
296
362
|
* const person = await db.updateTable('person')
|
|
297
|
-
* .set({
|
|
363
|
+
* .set({ deleted_at: now })
|
|
298
364
|
* .where('id', '=', id)
|
|
299
365
|
* .where('nullable_column', 'is not', null)
|
|
300
366
|
* .returningAll()
|
|
301
|
-
* .$narrowType<{
|
|
367
|
+
* .$narrowType<{ deleted_at: Date; nullable_column: NotNull }>()
|
|
302
368
|
* .executeTakeFirstOrThrow()
|
|
303
369
|
*
|
|
304
370
|
* functionThatExpectsPersonWithNonNullValue(person)
|
|
@@ -310,17 +376,17 @@ class UpdateQueryBuilder {
|
|
|
310
376
|
/**
|
|
311
377
|
* Asserts that query's output row type equals the given type `T`.
|
|
312
378
|
*
|
|
313
|
-
* This method can be used to simplify excessively complex types to make
|
|
379
|
+
* This method can be used to simplify excessively complex types to make TypeScript happy
|
|
314
380
|
* and much faster.
|
|
315
381
|
*
|
|
316
382
|
* Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
|
|
317
|
-
* for
|
|
383
|
+
* for TypeScript and you get errors like this:
|
|
318
384
|
*
|
|
319
385
|
* ```
|
|
320
386
|
* error TS2589: Type instantiation is excessively deep and possibly infinite.
|
|
321
387
|
* ```
|
|
322
388
|
*
|
|
323
|
-
* In these case you can often use this method to help
|
|
389
|
+
* In these case you can often use this method to help TypeScript a little bit. When you use this
|
|
324
390
|
* method to assert the output type of a query, Kysely can drop the complex output type that
|
|
325
391
|
* consists of multiple nested helper types and replace it with the simple asserted type.
|
|
326
392
|
*
|
|
@@ -330,6 +396,17 @@ class UpdateQueryBuilder {
|
|
|
330
396
|
* ### Examples
|
|
331
397
|
*
|
|
332
398
|
* ```ts
|
|
399
|
+
* import type { PersonUpdate, PetUpdate, Species } from 'type-editor' // imaginary module
|
|
400
|
+
*
|
|
401
|
+
* const person = {
|
|
402
|
+
* id: 1,
|
|
403
|
+
* gender: 'other',
|
|
404
|
+
* } satisfies PersonUpdate
|
|
405
|
+
*
|
|
406
|
+
* const pet = {
|
|
407
|
+
* name: 'Fluffy',
|
|
408
|
+
* } satisfies PetUpdate
|
|
409
|
+
*
|
|
333
410
|
* const result = await db
|
|
334
411
|
* .with('updated_person', (qb) => qb
|
|
335
412
|
* .updateTable('person')
|
|
@@ -375,9 +452,11 @@ class UpdateQueryBuilder {
|
|
|
375
452
|
*/
|
|
376
453
|
async execute() {
|
|
377
454
|
const compiledQuery = this.compile();
|
|
378
|
-
const query = compiledQuery.query;
|
|
379
455
|
const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
|
|
380
|
-
|
|
456
|
+
const { adapter } = this.#props.executor;
|
|
457
|
+
const query = compiledQuery.query;
|
|
458
|
+
if ((query.returning && adapter.supportsReturning) ||
|
|
459
|
+
(query.output && adapter.supportsOutput)) {
|
|
381
460
|
return result.rows;
|
|
382
461
|
}
|
|
383
462
|
return [
|
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
export declare class UpdateResult {
|
|
2
|
+
/**
|
|
3
|
+
* The number of rows the update query updated (even if not changed).
|
|
4
|
+
*/
|
|
2
5
|
readonly numUpdatedRows: bigint;
|
|
6
|
+
/**
|
|
7
|
+
* The number of rows the update query changed.
|
|
8
|
+
*
|
|
9
|
+
* This is **optional** and only supported in dialects such as MySQL.
|
|
10
|
+
* You would probably use {@link numUpdatedRows} in most cases.
|
|
11
|
+
*/
|
|
3
12
|
readonly numChangedRows?: bigint;
|
|
4
13
|
constructor(numUpdatedRows: bigint, numChangedRows: bigint | undefined);
|
|
5
14
|
}
|
|
@@ -2,7 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.UpdateResult = void 0;
|
|
4
4
|
class UpdateResult {
|
|
5
|
+
/**
|
|
6
|
+
* The number of rows the update query updated (even if not changed).
|
|
7
|
+
*/
|
|
5
8
|
numUpdatedRows;
|
|
9
|
+
/**
|
|
10
|
+
* The number of rows the update query changed.
|
|
11
|
+
*
|
|
12
|
+
* This is **optional** and only supported in dialects such as MySQL.
|
|
13
|
+
* You would probably use {@link numUpdatedRows} in most cases.
|
|
14
|
+
*/
|
|
6
15
|
numChangedRows;
|
|
7
16
|
constructor(numUpdatedRows, numChangedRows) {
|
|
8
17
|
this.numUpdatedRows = numUpdatedRows;
|
|
@@ -35,6 +35,8 @@ export interface WhereInterface<DB, TB extends keyof DB> {
|
|
|
35
35
|
* you can always use:
|
|
36
36
|
*
|
|
37
37
|
* ```ts
|
|
38
|
+
* import { sql } from 'kysely'
|
|
39
|
+
*
|
|
38
40
|
* sql`your operator`
|
|
39
41
|
* ```
|
|
40
42
|
*
|
|
@@ -46,7 +48,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
|
|
|
46
48
|
* const persons = await db
|
|
47
49
|
* .selectFrom('person')
|
|
48
50
|
* .selectAll()
|
|
49
|
-
* .where('id', 'in', [
|
|
51
|
+
* .where('id', 'in', [1, 2, 3])
|
|
50
52
|
* .execute()
|
|
51
53
|
* ```
|
|
52
54
|
*
|
|
@@ -265,7 +267,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
|
|
|
265
267
|
* .selectFrom('person')
|
|
266
268
|
* .selectAll()
|
|
267
269
|
* .where(
|
|
268
|
-
* sql
|
|
270
|
+
* sql<string>`coalesce(first_name, last_name)`,
|
|
269
271
|
* 'like',
|
|
270
272
|
* '%' + name + '%',
|
|
271
273
|
* )
|
|
@@ -294,6 +296,8 @@ export interface WhereInterface<DB, TB extends keyof DB> {
|
|
|
294
296
|
* import { sql } from 'kysely'
|
|
295
297
|
* const { ref } = db.dynamic
|
|
296
298
|
*
|
|
299
|
+
* const columnFromUserInput: string = 'id'
|
|
300
|
+
*
|
|
297
301
|
* const persons = await db
|
|
298
302
|
* .selectFrom('person')
|
|
299
303
|
* .selectAll()
|
|
@@ -94,6 +94,7 @@ import { AddIndexNode } from '../operation-node/add-index-node.js';
|
|
|
94
94
|
import { CastNode } from '../operation-node/cast-node.js';
|
|
95
95
|
import { FetchNode } from '../operation-node/fetch-node.js';
|
|
96
96
|
import { TopNode } from '../operation-node/top-node.js';
|
|
97
|
+
import { OutputNode } from '../operation-node/output-node.js';
|
|
97
98
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
98
99
|
#private;
|
|
99
100
|
protected get numParameters(): number;
|
|
@@ -195,6 +196,7 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
195
196
|
protected visitAddIndex(node: AddIndexNode): void;
|
|
196
197
|
protected visitCast(node: CastNode): void;
|
|
197
198
|
protected visitFetch(node: FetchNode): void;
|
|
199
|
+
protected visitOutput(node: OutputNode): void;
|
|
198
200
|
protected visitTop(node: TopNode): void;
|
|
199
201
|
protected append(str: string): void;
|
|
200
202
|
protected appendValue(parameter: unknown): void;
|
|
@@ -20,6 +20,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
20
20
|
compileQuery(node) {
|
|
21
21
|
this.#sql = '';
|
|
22
22
|
this.#parameters = [];
|
|
23
|
+
this.nodeStack.splice(0, this.nodeStack.length);
|
|
23
24
|
this.visitNode(node);
|
|
24
25
|
return (0, object_utils_js_1.freeze)({
|
|
25
26
|
query: node,
|
|
@@ -176,6 +177,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
176
177
|
this.compileList(node.columns);
|
|
177
178
|
this.append(')');
|
|
178
179
|
}
|
|
180
|
+
if (node.output) {
|
|
181
|
+
this.append(' ');
|
|
182
|
+
this.visitNode(node.output);
|
|
183
|
+
}
|
|
179
184
|
if (node.values) {
|
|
180
185
|
this.append(' ');
|
|
181
186
|
this.visitNode(node.values);
|
|
@@ -199,6 +204,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
199
204
|
if (isSubQuery && !merge_query_node_js_1.MergeQueryNode.is(rootQueryNode)) {
|
|
200
205
|
this.append(')');
|
|
201
206
|
}
|
|
207
|
+
if (node.endModifiers?.length) {
|
|
208
|
+
this.append(' ');
|
|
209
|
+
this.compileList(node.endModifiers, ' ');
|
|
210
|
+
}
|
|
202
211
|
}
|
|
203
212
|
visitValues(node) {
|
|
204
213
|
this.append('values ');
|
|
@@ -223,6 +232,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
223
232
|
this.append(' ');
|
|
224
233
|
}
|
|
225
234
|
this.visitNode(node.from);
|
|
235
|
+
if (node.output) {
|
|
236
|
+
this.append(' ');
|
|
237
|
+
this.visitNode(node.output);
|
|
238
|
+
}
|
|
226
239
|
if (node.using) {
|
|
227
240
|
this.append(' ');
|
|
228
241
|
this.visitNode(node.using);
|
|
@@ -250,6 +263,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
250
263
|
if (isSubQuery) {
|
|
251
264
|
this.append(')');
|
|
252
265
|
}
|
|
266
|
+
if (node.endModifiers?.length) {
|
|
267
|
+
this.append(' ');
|
|
268
|
+
this.compileList(node.endModifiers, ' ');
|
|
269
|
+
}
|
|
253
270
|
}
|
|
254
271
|
visitReturning(node) {
|
|
255
272
|
this.append('returning ');
|
|
@@ -393,6 +410,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
393
410
|
}
|
|
394
411
|
}
|
|
395
412
|
visitColumnDefinition(node) {
|
|
413
|
+
if (node.ifNotExists) {
|
|
414
|
+
this.append('if not exists ');
|
|
415
|
+
}
|
|
396
416
|
this.visitNode(node.column);
|
|
397
417
|
this.append(' ');
|
|
398
418
|
this.visitNode(node.dataType);
|
|
@@ -519,6 +539,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
519
539
|
if (node.updates) {
|
|
520
540
|
this.compileList(node.updates);
|
|
521
541
|
}
|
|
542
|
+
if (node.output) {
|
|
543
|
+
this.append(' ');
|
|
544
|
+
this.visitNode(node.output);
|
|
545
|
+
}
|
|
522
546
|
if (node.from) {
|
|
523
547
|
this.append(' ');
|
|
524
548
|
this.visitNode(node.from);
|
|
@@ -542,6 +566,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
542
566
|
if (isSubQuery && !merge_query_node_js_1.MergeQueryNode.is(rootQueryNode)) {
|
|
543
567
|
this.append(')');
|
|
544
568
|
}
|
|
569
|
+
if (node.endModifiers?.length) {
|
|
570
|
+
this.append(' ');
|
|
571
|
+
this.compileList(node.endModifiers, ' ');
|
|
572
|
+
}
|
|
545
573
|
}
|
|
546
574
|
visitColumnUpdate(node) {
|
|
547
575
|
this.visitNode(node.column);
|
|
@@ -957,6 +985,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
957
985
|
this.append('distinct ');
|
|
958
986
|
}
|
|
959
987
|
this.compileList(node.aggregated);
|
|
988
|
+
if (node.orderBy) {
|
|
989
|
+
this.append(' ');
|
|
990
|
+
this.visitNode(node.orderBy);
|
|
991
|
+
}
|
|
960
992
|
this.append(')');
|
|
961
993
|
if (node.filter) {
|
|
962
994
|
this.append(' filter(');
|
|
@@ -1093,7 +1125,15 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
1093
1125
|
}
|
|
1094
1126
|
if (node.whens) {
|
|
1095
1127
|
this.append(' ');
|
|
1096
|
-
this.compileList(node.whens);
|
|
1128
|
+
this.compileList(node.whens, ' ');
|
|
1129
|
+
}
|
|
1130
|
+
if (node.output) {
|
|
1131
|
+
this.append(' ');
|
|
1132
|
+
this.visitNode(node.output);
|
|
1133
|
+
}
|
|
1134
|
+
if (node.endModifiers?.length) {
|
|
1135
|
+
this.append(' ');
|
|
1136
|
+
this.compileList(node.endModifiers, ' ');
|
|
1097
1137
|
}
|
|
1098
1138
|
}
|
|
1099
1139
|
visitMatched(node) {
|
|
@@ -1134,6 +1174,10 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
1134
1174
|
this.visitNode(node.rowCount);
|
|
1135
1175
|
this.append(` rows ${node.modifier}`);
|
|
1136
1176
|
}
|
|
1177
|
+
visitOutput(node) {
|
|
1178
|
+
this.append('output ');
|
|
1179
|
+
this.compileList(node.selections);
|
|
1180
|
+
}
|
|
1137
1181
|
visitTop(node) {
|
|
1138
1182
|
this.append(`top(${node.expression})`);
|
|
1139
1183
|
if (node.modifiers) {
|
|
@@ -125,10 +125,10 @@ export declare class QueryCreator<DB> {
|
|
|
125
125
|
* ```
|
|
126
126
|
*/
|
|
127
127
|
selectFrom<TE extends keyof DB & string>(from: TE[]): SelectQueryBuilder<DB, ExtractTableAlias<DB, TE>, {}>;
|
|
128
|
-
selectFrom<TE extends TableExpression<DB,
|
|
128
|
+
selectFrom<TE extends TableExpression<DB, never>>(from: TE[]): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
|
|
129
129
|
selectFrom<TE extends keyof DB & string>(from: TE): SelectQueryBuilder<DB, ExtractTableAlias<DB, TE>, {}>;
|
|
130
130
|
selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, ExtractTableAlias<DB & PickTableWithAlias<DB, TE>, TE>, {}>;
|
|
131
|
-
selectFrom<TE extends TableExpression<DB,
|
|
131
|
+
selectFrom<TE extends TableExpression<DB, never>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, never, TE>, {}>;
|
|
132
132
|
/**
|
|
133
133
|
* Creates a `select` query builder without a `from` clause.
|
|
134
134
|
*
|
|
@@ -141,20 +141,19 @@ export declare class QueryCreator<DB> {
|
|
|
141
141
|
* ### Examples
|
|
142
142
|
*
|
|
143
143
|
* ```ts
|
|
144
|
-
* const result = db.selectNoFrom((eb) => [
|
|
144
|
+
* const result = await db.selectNoFrom((eb) => [
|
|
145
145
|
* eb.selectFrom('person')
|
|
146
146
|
* .select('id')
|
|
147
147
|
* .where('first_name', '=', 'Jennifer')
|
|
148
148
|
* .limit(1)
|
|
149
149
|
* .as('jennifer_id'),
|
|
150
|
-
*
|
|
151
150
|
* eb.selectFrom('pet')
|
|
152
151
|
* .select('id')
|
|
153
152
|
* .where('name', '=', 'Doggo')
|
|
154
153
|
* .limit(1)
|
|
155
154
|
* .as('doggo_id')
|
|
156
|
-
*
|
|
157
|
-
*
|
|
155
|
+
* ])
|
|
156
|
+
* .executeTakeFirstOrThrow()
|
|
158
157
|
*
|
|
159
158
|
* console.log(result.jennifer_id)
|
|
160
159
|
* console.log(result.doggo_id)
|
|
@@ -214,7 +213,7 @@ export declare class QueryCreator<DB> {
|
|
|
214
213
|
* last_name: 'Aniston'
|
|
215
214
|
* })
|
|
216
215
|
* .returning('id')
|
|
217
|
-
* .
|
|
216
|
+
* .executeTakeFirstOrThrow()
|
|
218
217
|
* ```
|
|
219
218
|
*/
|
|
220
219
|
insertInto<T extends keyof DB & string>(table: T): InsertQueryBuilder<DB, T, InsertResult>;
|
|
@@ -262,7 +261,7 @@ export declare class QueryCreator<DB> {
|
|
|
262
261
|
* ```ts
|
|
263
262
|
* const result = await db
|
|
264
263
|
* .deleteFrom('person')
|
|
265
|
-
* .where('person.id', '=',
|
|
264
|
+
* .where('person.id', '=', 1)
|
|
266
265
|
* .executeTakeFirst()
|
|
267
266
|
*
|
|
268
267
|
* console.log(result.numDeletedRows)
|
|
@@ -280,7 +279,7 @@ export declare class QueryCreator<DB> {
|
|
|
280
279
|
* const result = await db
|
|
281
280
|
* .deleteFrom(['person', 'pet'])
|
|
282
281
|
* .using('person')
|
|
283
|
-
* .innerJoin('pet', 'pet.owner_id', '
|
|
282
|
+
* .innerJoin('pet', 'pet.owner_id', 'person.id')
|
|
284
283
|
* .where('person.id', '=', 1)
|
|
285
284
|
* .executeTakeFirst()
|
|
286
285
|
* ```
|
|
@@ -334,14 +333,18 @@ export declare class QueryCreator<DB> {
|
|
|
334
333
|
*
|
|
335
334
|
* ### Examples
|
|
336
335
|
*
|
|
336
|
+
* <!-- siteExample("merge", "Source row existence", 10) -->
|
|
337
|
+
*
|
|
338
|
+
* Update a target column based on the existence of a source row:
|
|
339
|
+
*
|
|
337
340
|
* ```ts
|
|
338
341
|
* const result = await db
|
|
339
|
-
* .mergeInto('person')
|
|
340
|
-
* .using('pet', '
|
|
341
|
-
* .
|
|
342
|
+
* .mergeInto('person as target')
|
|
343
|
+
* .using('pet as source', 'source.owner_id', 'target.id')
|
|
344
|
+
* .whenMatchedAnd('target.has_pets', '!=', 'Y')
|
|
342
345
|
* .thenUpdateSet({ has_pets: 'Y' })
|
|
343
|
-
* .
|
|
344
|
-
* .
|
|
346
|
+
* .whenNotMatchedBySourceAnd('target.has_pets', '=', 'Y')
|
|
347
|
+
* .thenUpdateSet({ has_pets: 'N' })
|
|
345
348
|
* .executeTakeFirstOrThrow()
|
|
346
349
|
*
|
|
347
350
|
* console.log(result.numChangedRows)
|
|
@@ -351,11 +354,56 @@ export declare class QueryCreator<DB> {
|
|
|
351
354
|
*
|
|
352
355
|
* ```sql
|
|
353
356
|
* merge into "person"
|
|
354
|
-
* using "pet"
|
|
355
|
-
*
|
|
356
|
-
*
|
|
357
|
-
*
|
|
358
|
-
*
|
|
357
|
+
* using "pet"
|
|
358
|
+
* on "pet"."owner_id" = "person"."id"
|
|
359
|
+
* when matched and "has_pets" != $1
|
|
360
|
+
* then update set "has_pets" = $2
|
|
361
|
+
* when not matched by source and "has_pets" = $3
|
|
362
|
+
* then update set "has_pets" = $4
|
|
363
|
+
* ```
|
|
364
|
+
*
|
|
365
|
+
* <!-- siteExample("merge", "Temporary changes table", 20) -->
|
|
366
|
+
*
|
|
367
|
+
* Merge new entries from a temporary changes table:
|
|
368
|
+
*
|
|
369
|
+
* ```ts
|
|
370
|
+
* const result = await db
|
|
371
|
+
* .mergeInto('wine as target')
|
|
372
|
+
* .using(
|
|
373
|
+
* 'wine_stock_change as source',
|
|
374
|
+
* 'source.wine_name',
|
|
375
|
+
* 'target.name',
|
|
376
|
+
* )
|
|
377
|
+
* .whenNotMatchedAnd('source.stock_delta', '>', 0)
|
|
378
|
+
* .thenInsertValues(({ ref }) => ({
|
|
379
|
+
* name: ref('source.wine_name'),
|
|
380
|
+
* stock: ref('source.stock_delta'),
|
|
381
|
+
* }))
|
|
382
|
+
* .whenMatchedAnd(
|
|
383
|
+
* (eb) => eb('target.stock', '+', eb.ref('source.stock_delta')),
|
|
384
|
+
* '>',
|
|
385
|
+
* 0,
|
|
386
|
+
* )
|
|
387
|
+
* .thenUpdateSet('stock', (eb) =>
|
|
388
|
+
* eb('target.stock', '+', eb.ref('source.stock_delta')),
|
|
389
|
+
* )
|
|
390
|
+
* .whenMatched()
|
|
391
|
+
* .thenDelete()
|
|
392
|
+
* .executeTakeFirstOrThrow()
|
|
393
|
+
* ```
|
|
394
|
+
*
|
|
395
|
+
* The generated SQL (PostgreSQL):
|
|
396
|
+
*
|
|
397
|
+
* ```sql
|
|
398
|
+
* merge into "wine" as "target"
|
|
399
|
+
* using "wine_stock_change" as "source"
|
|
400
|
+
* on "source"."wine_name" = "target"."name"
|
|
401
|
+
* when not matched and "source"."stock_delta" > $1
|
|
402
|
+
* then insert ("name", "stock") values ("source"."wine_name", "source"."stock_delta")
|
|
403
|
+
* when matched and "target"."stock" + "source"."stock_delta" > $2
|
|
404
|
+
* then update set "stock" = "target"."stock" + "source"."stock_delta"
|
|
405
|
+
* when matched
|
|
406
|
+
* then delete
|
|
359
407
|
* ```
|
|
360
408
|
*/
|
|
361
409
|
mergeInto<TR extends keyof DB & string>(targetTable: TR): MergeQueryBuilder<DB, TR, MergeResult>;
|
|
@@ -365,24 +413,77 @@ export declare class QueryCreator<DB> {
|
|
|
365
413
|
*
|
|
366
414
|
* ### Examples
|
|
367
415
|
*
|
|
416
|
+
* <!-- siteExample("cte", "Simple selects", 10) -->
|
|
417
|
+
*
|
|
418
|
+
* Common table expressions (CTE) are a great way to modularize complex queries.
|
|
419
|
+
* Essentially they allow you to run multiple separate queries within a
|
|
420
|
+
* single roundtrip to the DB.
|
|
421
|
+
*
|
|
422
|
+
* Since CTEs are a part of the main query, query optimizers inside DB
|
|
423
|
+
* engines are able to optimize the overall query. For example, postgres
|
|
424
|
+
* is able to inline the CTEs inside the using queries if it decides it's
|
|
425
|
+
* faster.
|
|
426
|
+
*
|
|
368
427
|
* ```ts
|
|
369
|
-
* await db
|
|
428
|
+
* const result = await db
|
|
429
|
+
* // Create a CTE called `jennifers` that selects all
|
|
430
|
+
* // persons named 'Jennifer'.
|
|
370
431
|
* .with('jennifers', (db) => db
|
|
371
432
|
* .selectFrom('person')
|
|
372
433
|
* .where('first_name', '=', 'Jennifer')
|
|
373
434
|
* .select(['id', 'age'])
|
|
374
435
|
* )
|
|
436
|
+
* // Select all rows from the `jennifers` CTE and
|
|
437
|
+
* // further filter it.
|
|
375
438
|
* .with('adult_jennifers', (db) => db
|
|
376
439
|
* .selectFrom('jennifers')
|
|
377
440
|
* .where('age', '>', 18)
|
|
378
441
|
* .select(['id', 'age'])
|
|
379
442
|
* )
|
|
443
|
+
* // Finally select all adult jennifers that are
|
|
444
|
+
* // also younger than 60.
|
|
380
445
|
* .selectFrom('adult_jennifers')
|
|
381
446
|
* .where('age', '<', 60)
|
|
382
447
|
* .selectAll()
|
|
383
448
|
* .execute()
|
|
384
449
|
* ```
|
|
385
450
|
*
|
|
451
|
+
* <!-- siteExample("cte", "Inserts, updates and deletions", 20) -->
|
|
452
|
+
*
|
|
453
|
+
* Some databases like postgres also allow you to run other queries than selects
|
|
454
|
+
* in CTEs. On these databases CTEs are extremely powerful:
|
|
455
|
+
*
|
|
456
|
+
* ```ts
|
|
457
|
+
* const result = await db
|
|
458
|
+
* .with('new_person', (db) => db
|
|
459
|
+
* .insertInto('person')
|
|
460
|
+
* .values({
|
|
461
|
+
* first_name: 'Jennifer',
|
|
462
|
+
* age: 35,
|
|
463
|
+
* })
|
|
464
|
+
* .returning('id')
|
|
465
|
+
* )
|
|
466
|
+
* .with('new_pet', (db) => db
|
|
467
|
+
* .insertInto('pet')
|
|
468
|
+
* .values({
|
|
469
|
+
* name: 'Doggo',
|
|
470
|
+
* species: 'dog',
|
|
471
|
+
* is_favorite: true,
|
|
472
|
+
* // Use the id of the person we just inserted.
|
|
473
|
+
* owner_id: db
|
|
474
|
+
* .selectFrom('new_person')
|
|
475
|
+
* .select('id')
|
|
476
|
+
* })
|
|
477
|
+
* .returning('id')
|
|
478
|
+
* )
|
|
479
|
+
* .selectFrom(['new_person', 'new_pet'])
|
|
480
|
+
* .select([
|
|
481
|
+
* 'new_person.id as person_id',
|
|
482
|
+
* 'new_pet.id as pet_id'
|
|
483
|
+
* ])
|
|
484
|
+
* .execute()
|
|
485
|
+
* ```
|
|
486
|
+
*
|
|
386
487
|
* The CTE name can optionally specify column names in addition to
|
|
387
488
|
* a name. In that case Kysely requires the expression to retun
|
|
388
489
|
* rows with the same columns.
|
|
@@ -445,7 +546,7 @@ export declare class QueryCreator<DB> {
|
|
|
445
546
|
* This only affects the query created through the builder returned from
|
|
446
547
|
* this method and doesn't modify the `db` instance.
|
|
447
548
|
*
|
|
448
|
-
* See [this recipe](https://github.com/
|
|
549
|
+
* See [this recipe](https://github.com/kysely-org/kysely/blob/master/site/docs/recipes/0007-schemas.md)
|
|
449
550
|
* for a more detailed explanation.
|
|
450
551
|
*
|
|
451
552
|
* ### Examples
|