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
|
@@ -119,15 +119,17 @@ export class UpdateQueryBuilder {
|
|
|
119
119
|
* Update the first 2 rows in the 'person' table:
|
|
120
120
|
*
|
|
121
121
|
* ```ts
|
|
122
|
-
*
|
|
122
|
+
* await db
|
|
123
123
|
* .updateTable('person')
|
|
124
124
|
* .set({ first_name: 'Foo' })
|
|
125
|
-
* .limit(2)
|
|
125
|
+
* .limit(2)
|
|
126
|
+
* .execute()
|
|
126
127
|
* ```
|
|
127
128
|
*
|
|
128
129
|
* The generated SQL (MySQL):
|
|
130
|
+
*
|
|
129
131
|
* ```sql
|
|
130
|
-
* update `person` set `first_name` =
|
|
132
|
+
* update `person` set `first_name` = ? limit ?
|
|
131
133
|
* ```
|
|
132
134
|
*/
|
|
133
135
|
limit(limit) {
|
|
@@ -148,10 +150,51 @@ export class UpdateQueryBuilder {
|
|
|
148
150
|
queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectArg(selection)),
|
|
149
151
|
});
|
|
150
152
|
}
|
|
151
|
-
returningAll() {
|
|
153
|
+
returningAll(table) {
|
|
154
|
+
return new UpdateQueryBuilder({
|
|
155
|
+
...this.#props,
|
|
156
|
+
queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll(table)),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
output(args) {
|
|
160
|
+
return new UpdateQueryBuilder({
|
|
161
|
+
...this.#props,
|
|
162
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectArg(args)),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
outputAll(table) {
|
|
166
|
+
return new UpdateQueryBuilder({
|
|
167
|
+
...this.#props,
|
|
168
|
+
queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectAll(table)),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* This can be used to add any additional SQL to the end of the query.
|
|
173
|
+
*
|
|
174
|
+
* ### Examples
|
|
175
|
+
*
|
|
176
|
+
* ```ts
|
|
177
|
+
* import { sql } from 'kysely'
|
|
178
|
+
*
|
|
179
|
+
* await db.updateTable('person')
|
|
180
|
+
* .set({ age: 39 })
|
|
181
|
+
* .where('first_name', '=', 'John')
|
|
182
|
+
* .modifyEnd(sql.raw('-- This is a comment'))
|
|
183
|
+
* .execute()
|
|
184
|
+
* ```
|
|
185
|
+
*
|
|
186
|
+
* The generated SQL (MySQL):
|
|
187
|
+
*
|
|
188
|
+
* ```sql
|
|
189
|
+
* update `person`
|
|
190
|
+
* set `age` = 39
|
|
191
|
+
* where `first_name` = "John" -- This is a comment
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
modifyEnd(modifier) {
|
|
152
195
|
return new UpdateQueryBuilder({
|
|
153
196
|
...this.#props,
|
|
154
|
-
queryNode: QueryNode.
|
|
197
|
+
queryNode: QueryNode.cloneWithEndModifier(this.#props.queryNode, modifier.toOperationNode()),
|
|
155
198
|
});
|
|
156
199
|
}
|
|
157
200
|
/**
|
|
@@ -191,11 +234,18 @@ export class UpdateQueryBuilder {
|
|
|
191
234
|
* The next example uses a helper function `log` to log a query:
|
|
192
235
|
*
|
|
193
236
|
* ```ts
|
|
237
|
+
* import type { Compilable } from 'kysely'
|
|
238
|
+
* import type { PersonUpdate } from 'type-editor' // imaginary module
|
|
239
|
+
*
|
|
194
240
|
* function log<T extends Compilable>(qb: T): T {
|
|
195
241
|
* console.log(qb.compile())
|
|
196
242
|
* return qb
|
|
197
243
|
* }
|
|
198
244
|
*
|
|
245
|
+
* const values = {
|
|
246
|
+
* first_name: 'John',
|
|
247
|
+
* } satisfies PersonUpdate
|
|
248
|
+
*
|
|
199
249
|
* db.updateTable('person')
|
|
200
250
|
* .set(values)
|
|
201
251
|
* .$call(log)
|
|
@@ -218,7 +268,9 @@ export class UpdateQueryBuilder {
|
|
|
218
268
|
* ### Examples
|
|
219
269
|
*
|
|
220
270
|
* ```ts
|
|
221
|
-
*
|
|
271
|
+
* import type { PersonUpdate } from 'type-editor' // imaginary module
|
|
272
|
+
*
|
|
273
|
+
* async function updatePerson(id: number, updates: PersonUpdate, returnLastName: boolean) {
|
|
222
274
|
* return await db
|
|
223
275
|
* .updateTable('person')
|
|
224
276
|
* .set(updates)
|
|
@@ -234,11 +286,11 @@ export class UpdateQueryBuilder {
|
|
|
234
286
|
* the code. In the example above the return type of the `updatePerson` function is:
|
|
235
287
|
*
|
|
236
288
|
* ```ts
|
|
237
|
-
* {
|
|
289
|
+
* Promise<{
|
|
238
290
|
* id: number
|
|
239
291
|
* first_name: string
|
|
240
292
|
* last_name?: string
|
|
241
|
-
* }
|
|
293
|
+
* }>
|
|
242
294
|
* ```
|
|
243
295
|
*/
|
|
244
296
|
$if(condition, func) {
|
|
@@ -276,27 +328,41 @@ export class UpdateQueryBuilder {
|
|
|
276
328
|
* Turn this code:
|
|
277
329
|
*
|
|
278
330
|
* ```ts
|
|
331
|
+
* import type { Person } from 'type-editor' // imaginary module
|
|
332
|
+
*
|
|
333
|
+
* const id = 1
|
|
334
|
+
* const now = new Date().toISOString()
|
|
335
|
+
*
|
|
279
336
|
* const person = await db.updateTable('person')
|
|
280
|
-
* .set({
|
|
337
|
+
* .set({ deleted_at: now })
|
|
281
338
|
* .where('id', '=', id)
|
|
282
339
|
* .where('nullable_column', 'is not', null)
|
|
283
340
|
* .returningAll()
|
|
284
341
|
* .executeTakeFirstOrThrow()
|
|
285
342
|
*
|
|
286
|
-
* if (person
|
|
343
|
+
* if (isWithNoNullValue(person)) {
|
|
287
344
|
* functionThatExpectsPersonWithNonNullValue(person)
|
|
288
345
|
* }
|
|
346
|
+
*
|
|
347
|
+
* function isWithNoNullValue(person: Person): person is Person & { nullable_column: string } {
|
|
348
|
+
* return person.nullable_column != null
|
|
349
|
+
* }
|
|
289
350
|
* ```
|
|
290
351
|
*
|
|
291
352
|
* Into this:
|
|
292
353
|
*
|
|
293
354
|
* ```ts
|
|
355
|
+
* import type { NotNull } from 'kysely'
|
|
356
|
+
*
|
|
357
|
+
* const id = 1
|
|
358
|
+
* const now = new Date().toISOString()
|
|
359
|
+
*
|
|
294
360
|
* const person = await db.updateTable('person')
|
|
295
|
-
* .set({
|
|
361
|
+
* .set({ deleted_at: now })
|
|
296
362
|
* .where('id', '=', id)
|
|
297
363
|
* .where('nullable_column', 'is not', null)
|
|
298
364
|
* .returningAll()
|
|
299
|
-
* .$narrowType<{
|
|
365
|
+
* .$narrowType<{ deleted_at: Date; nullable_column: NotNull }>()
|
|
300
366
|
* .executeTakeFirstOrThrow()
|
|
301
367
|
*
|
|
302
368
|
* functionThatExpectsPersonWithNonNullValue(person)
|
|
@@ -308,17 +374,17 @@ export class UpdateQueryBuilder {
|
|
|
308
374
|
/**
|
|
309
375
|
* Asserts that query's output row type equals the given type `T`.
|
|
310
376
|
*
|
|
311
|
-
* This method can be used to simplify excessively complex types to make
|
|
377
|
+
* This method can be used to simplify excessively complex types to make TypeScript happy
|
|
312
378
|
* and much faster.
|
|
313
379
|
*
|
|
314
380
|
* Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
|
|
315
|
-
* for
|
|
381
|
+
* for TypeScript and you get errors like this:
|
|
316
382
|
*
|
|
317
383
|
* ```
|
|
318
384
|
* error TS2589: Type instantiation is excessively deep and possibly infinite.
|
|
319
385
|
* ```
|
|
320
386
|
*
|
|
321
|
-
* In these case you can often use this method to help
|
|
387
|
+
* In these case you can often use this method to help TypeScript a little bit. When you use this
|
|
322
388
|
* method to assert the output type of a query, Kysely can drop the complex output type that
|
|
323
389
|
* consists of multiple nested helper types and replace it with the simple asserted type.
|
|
324
390
|
*
|
|
@@ -328,6 +394,17 @@ export class UpdateQueryBuilder {
|
|
|
328
394
|
* ### Examples
|
|
329
395
|
*
|
|
330
396
|
* ```ts
|
|
397
|
+
* import type { PersonUpdate, PetUpdate, Species } from 'type-editor' // imaginary module
|
|
398
|
+
*
|
|
399
|
+
* const person = {
|
|
400
|
+
* id: 1,
|
|
401
|
+
* gender: 'other',
|
|
402
|
+
* } satisfies PersonUpdate
|
|
403
|
+
*
|
|
404
|
+
* const pet = {
|
|
405
|
+
* name: 'Fluffy',
|
|
406
|
+
* } satisfies PetUpdate
|
|
407
|
+
*
|
|
331
408
|
* const result = await db
|
|
332
409
|
* .with('updated_person', (qb) => qb
|
|
333
410
|
* .updateTable('person')
|
|
@@ -373,9 +450,11 @@ export class UpdateQueryBuilder {
|
|
|
373
450
|
*/
|
|
374
451
|
async execute() {
|
|
375
452
|
const compiledQuery = this.compile();
|
|
376
|
-
const query = compiledQuery.query;
|
|
377
453
|
const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
|
|
378
|
-
|
|
454
|
+
const { adapter } = this.#props.executor;
|
|
455
|
+
const query = compiledQuery.query;
|
|
456
|
+
if ((query.returning && adapter.supportsReturning) ||
|
|
457
|
+
(query.output && adapter.supportsOutput)) {
|
|
379
458
|
return result.rows;
|
|
380
459
|
}
|
|
381
460
|
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
|
}
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
/// <reference types="./update-result.d.ts" />
|
|
2
2
|
export class UpdateResult {
|
|
3
|
+
/**
|
|
4
|
+
* The number of rows the update query updated (even if not changed).
|
|
5
|
+
*/
|
|
3
6
|
numUpdatedRows;
|
|
7
|
+
/**
|
|
8
|
+
* The number of rows the update query changed.
|
|
9
|
+
*
|
|
10
|
+
* This is **optional** and only supported in dialects such as MySQL.
|
|
11
|
+
* You would probably use {@link numUpdatedRows} in most cases.
|
|
12
|
+
*/
|
|
4
13
|
numChangedRows;
|
|
5
14
|
constructor(numUpdatedRows, numChangedRows) {
|
|
6
15
|
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;
|
|
@@ -18,6 +18,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
18
18
|
compileQuery(node) {
|
|
19
19
|
this.#sql = '';
|
|
20
20
|
this.#parameters = [];
|
|
21
|
+
this.nodeStack.splice(0, this.nodeStack.length);
|
|
21
22
|
this.visitNode(node);
|
|
22
23
|
return freeze({
|
|
23
24
|
query: node,
|
|
@@ -174,6 +175,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
174
175
|
this.compileList(node.columns);
|
|
175
176
|
this.append(')');
|
|
176
177
|
}
|
|
178
|
+
if (node.output) {
|
|
179
|
+
this.append(' ');
|
|
180
|
+
this.visitNode(node.output);
|
|
181
|
+
}
|
|
177
182
|
if (node.values) {
|
|
178
183
|
this.append(' ');
|
|
179
184
|
this.visitNode(node.values);
|
|
@@ -197,6 +202,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
197
202
|
if (isSubQuery && !MergeQueryNode.is(rootQueryNode)) {
|
|
198
203
|
this.append(')');
|
|
199
204
|
}
|
|
205
|
+
if (node.endModifiers?.length) {
|
|
206
|
+
this.append(' ');
|
|
207
|
+
this.compileList(node.endModifiers, ' ');
|
|
208
|
+
}
|
|
200
209
|
}
|
|
201
210
|
visitValues(node) {
|
|
202
211
|
this.append('values ');
|
|
@@ -221,6 +230,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
221
230
|
this.append(' ');
|
|
222
231
|
}
|
|
223
232
|
this.visitNode(node.from);
|
|
233
|
+
if (node.output) {
|
|
234
|
+
this.append(' ');
|
|
235
|
+
this.visitNode(node.output);
|
|
236
|
+
}
|
|
224
237
|
if (node.using) {
|
|
225
238
|
this.append(' ');
|
|
226
239
|
this.visitNode(node.using);
|
|
@@ -248,6 +261,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
248
261
|
if (isSubQuery) {
|
|
249
262
|
this.append(')');
|
|
250
263
|
}
|
|
264
|
+
if (node.endModifiers?.length) {
|
|
265
|
+
this.append(' ');
|
|
266
|
+
this.compileList(node.endModifiers, ' ');
|
|
267
|
+
}
|
|
251
268
|
}
|
|
252
269
|
visitReturning(node) {
|
|
253
270
|
this.append('returning ');
|
|
@@ -391,6 +408,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
391
408
|
}
|
|
392
409
|
}
|
|
393
410
|
visitColumnDefinition(node) {
|
|
411
|
+
if (node.ifNotExists) {
|
|
412
|
+
this.append('if not exists ');
|
|
413
|
+
}
|
|
394
414
|
this.visitNode(node.column);
|
|
395
415
|
this.append(' ');
|
|
396
416
|
this.visitNode(node.dataType);
|
|
@@ -517,6 +537,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
517
537
|
if (node.updates) {
|
|
518
538
|
this.compileList(node.updates);
|
|
519
539
|
}
|
|
540
|
+
if (node.output) {
|
|
541
|
+
this.append(' ');
|
|
542
|
+
this.visitNode(node.output);
|
|
543
|
+
}
|
|
520
544
|
if (node.from) {
|
|
521
545
|
this.append(' ');
|
|
522
546
|
this.visitNode(node.from);
|
|
@@ -540,6 +564,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
540
564
|
if (isSubQuery && !MergeQueryNode.is(rootQueryNode)) {
|
|
541
565
|
this.append(')');
|
|
542
566
|
}
|
|
567
|
+
if (node.endModifiers?.length) {
|
|
568
|
+
this.append(' ');
|
|
569
|
+
this.compileList(node.endModifiers, ' ');
|
|
570
|
+
}
|
|
543
571
|
}
|
|
544
572
|
visitColumnUpdate(node) {
|
|
545
573
|
this.visitNode(node.column);
|
|
@@ -955,6 +983,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
955
983
|
this.append('distinct ');
|
|
956
984
|
}
|
|
957
985
|
this.compileList(node.aggregated);
|
|
986
|
+
if (node.orderBy) {
|
|
987
|
+
this.append(' ');
|
|
988
|
+
this.visitNode(node.orderBy);
|
|
989
|
+
}
|
|
958
990
|
this.append(')');
|
|
959
991
|
if (node.filter) {
|
|
960
992
|
this.append(' filter(');
|
|
@@ -1091,7 +1123,15 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
1091
1123
|
}
|
|
1092
1124
|
if (node.whens) {
|
|
1093
1125
|
this.append(' ');
|
|
1094
|
-
this.compileList(node.whens);
|
|
1126
|
+
this.compileList(node.whens, ' ');
|
|
1127
|
+
}
|
|
1128
|
+
if (node.output) {
|
|
1129
|
+
this.append(' ');
|
|
1130
|
+
this.visitNode(node.output);
|
|
1131
|
+
}
|
|
1132
|
+
if (node.endModifiers?.length) {
|
|
1133
|
+
this.append(' ');
|
|
1134
|
+
this.compileList(node.endModifiers, ' ');
|
|
1095
1135
|
}
|
|
1096
1136
|
}
|
|
1097
1137
|
visitMatched(node) {
|
|
@@ -1132,6 +1172,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
1132
1172
|
this.visitNode(node.rowCount);
|
|
1133
1173
|
this.append(` rows ${node.modifier}`);
|
|
1134
1174
|
}
|
|
1175
|
+
visitOutput(node) {
|
|
1176
|
+
this.append('output ');
|
|
1177
|
+
this.compileList(node.selections);
|
|
1178
|
+
}
|
|
1135
1179
|
visitTop(node) {
|
|
1136
1180
|
this.append(`top(${node.expression})`);
|
|
1137
1181
|
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
|