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
|
@@ -61,6 +61,8 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
61
61
|
* you can always use:
|
|
62
62
|
*
|
|
63
63
|
* ```ts
|
|
64
|
+
* import { sql } from 'kysely'
|
|
65
|
+
*
|
|
64
66
|
* sql`your operator`
|
|
65
67
|
* ```
|
|
66
68
|
*
|
|
@@ -72,7 +74,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
72
74
|
* const persons = await db
|
|
73
75
|
* .selectFrom('person')
|
|
74
76
|
* .selectAll()
|
|
75
|
-
* .where('id', 'in', [
|
|
77
|
+
* .where('id', 'in', [1, 2, 3])
|
|
76
78
|
* .execute()
|
|
77
79
|
* ```
|
|
78
80
|
*
|
|
@@ -291,7 +293,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
291
293
|
* .selectFrom('person')
|
|
292
294
|
* .selectAll()
|
|
293
295
|
* .where(
|
|
294
|
-
* sql
|
|
296
|
+
* sql<string>`coalesce(first_name, last_name)`,
|
|
295
297
|
* 'like',
|
|
296
298
|
* '%' + name + '%',
|
|
297
299
|
* )
|
|
@@ -320,6 +322,8 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
320
322
|
* import { sql } from 'kysely'
|
|
321
323
|
* const { ref } = db.dynamic
|
|
322
324
|
*
|
|
325
|
+
* const columnFromUserInput: string = 'id'
|
|
326
|
+
*
|
|
323
327
|
* const persons = await db
|
|
324
328
|
* .selectFrom('person')
|
|
325
329
|
* .selectAll()
|
|
@@ -542,6 +546,45 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
542
546
|
* In case you use the {@link sql} tag you need to specify the type of the expression
|
|
543
547
|
* (in this example `string`).
|
|
544
548
|
*
|
|
549
|
+
* <!-- siteExample("select", "Not null", 51) -->
|
|
550
|
+
*
|
|
551
|
+
* Sometimes you can be sure something's not null, but Kysely isn't able to infer
|
|
552
|
+
* it. For example calling `where('last_name', 'is not', null)` doesn't make
|
|
553
|
+
* `last_name` not null in the result type, but unless you have other where statements
|
|
554
|
+
* you can be sure it's never null.
|
|
555
|
+
*
|
|
556
|
+
* Kysely has a couple of helpers for dealing with these cases: `$notNull()` and `$narrowType`.
|
|
557
|
+
* Both are used in the following example:
|
|
558
|
+
*
|
|
559
|
+
* ```ts
|
|
560
|
+
* import { NotNull } from 'kysely'
|
|
561
|
+
* import { jsonObjectFrom } from 'kysely/helpers/postgres'
|
|
562
|
+
*
|
|
563
|
+
* const persons = db
|
|
564
|
+
* .selectFrom('person')
|
|
565
|
+
* .select((eb) => [
|
|
566
|
+
* 'last_name',
|
|
567
|
+
* // Let's assume we know the person has at least one
|
|
568
|
+
* // pet. We can use the `.$notNull()` method to make
|
|
569
|
+
* // the expression not null. You could just as well
|
|
570
|
+
* // add `pet` to the `$narrowType` call below.
|
|
571
|
+
* jsonObjectFrom(
|
|
572
|
+
* eb.selectFrom('pet')
|
|
573
|
+
* .selectAll()
|
|
574
|
+
* .limit(1)
|
|
575
|
+
* .whereRef('person.id', '=', 'pet.owner_id')
|
|
576
|
+
* ).$notNull().as('pet')
|
|
577
|
+
* ])
|
|
578
|
+
* .where('last_name', 'is not', null)
|
|
579
|
+
* // $narrowType can be used to narrow the output type.
|
|
580
|
+
* // The special `NotNull` type can be used to make a
|
|
581
|
+
* // selection not null. You could add `pet: NotNull`
|
|
582
|
+
* // here and omit the `$notNull()` call on it.
|
|
583
|
+
* // Use whichever way you prefer.
|
|
584
|
+
* .$narrowType<{ last_name: NotNull }>()
|
|
585
|
+
* .execute()
|
|
586
|
+
* ```
|
|
587
|
+
*
|
|
545
588
|
* All the examples above assume you know the column names at compile time.
|
|
546
589
|
* While it's better to build your code like that (that way you also know
|
|
547
590
|
* the types) sometimes it's not possible or you just prefer to write more
|
|
@@ -554,16 +597,16 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
554
597
|
* const { ref } = db.dynamic
|
|
555
598
|
*
|
|
556
599
|
* // Some column name provided by the user. Value not known at compile time.
|
|
557
|
-
* const columnFromUserInput =
|
|
600
|
+
* const columnFromUserInput: string = 'first_name';
|
|
558
601
|
*
|
|
559
602
|
* // A type that lists all possible values `columnFromUserInput` can have.
|
|
560
603
|
* // You can use `keyof Person` if any column of an interface is allowed.
|
|
561
|
-
* type PossibleColumns = 'last_name' | 'first_name' | '
|
|
604
|
+
* type PossibleColumns = 'last_name' | 'first_name' | 'birthdate'
|
|
562
605
|
*
|
|
563
|
-
* const
|
|
606
|
+
* const people = await db
|
|
564
607
|
* .selectFrom('person')
|
|
565
608
|
* .select([
|
|
566
|
-
* ref<PossibleColumns>(columnFromUserInput)
|
|
609
|
+
* ref<PossibleColumns>(columnFromUserInput),
|
|
567
610
|
* 'id'
|
|
568
611
|
* ])
|
|
569
612
|
* .execute()
|
|
@@ -571,12 +614,12 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
571
614
|
* // The resulting type contains all `PossibleColumns` as optional fields
|
|
572
615
|
* // because we cannot know which field was actually selected before
|
|
573
616
|
* // running the code.
|
|
574
|
-
* const lastName: string | undefined =
|
|
575
|
-
* const firstName: string | undefined =
|
|
576
|
-
* const birthDate:
|
|
617
|
+
* const lastName: string | null | undefined = people[0].last_name
|
|
618
|
+
* const firstName: string | undefined = people[0].first_name
|
|
619
|
+
* const birthDate: Date | null | undefined = people[0].birthdate
|
|
577
620
|
*
|
|
578
621
|
* // The result type also contains the compile time selection `id`.
|
|
579
|
-
*
|
|
622
|
+
* people[0].id
|
|
580
623
|
* ```
|
|
581
624
|
*/
|
|
582
625
|
select<SE extends SelectExpression<DB, TB>>(selections: ReadonlyArray<SE>): SelectQueryBuilder<DB, TB, O & Selection<DB, TB, SE>>;
|
|
@@ -615,7 +658,9 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
615
658
|
* ### Examples
|
|
616
659
|
*
|
|
617
660
|
* ```ts
|
|
618
|
-
*
|
|
661
|
+
* import { sql } from 'kysely'
|
|
662
|
+
*
|
|
663
|
+
* await db.selectFrom('person')
|
|
619
664
|
* .modifyFront(sql`sql_no_cache`)
|
|
620
665
|
* .select('first_name')
|
|
621
666
|
* .execute()
|
|
@@ -638,7 +683,9 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
638
683
|
* ### Examples
|
|
639
684
|
*
|
|
640
685
|
* ```ts
|
|
641
|
-
*
|
|
686
|
+
* import { sql } from 'kysely'
|
|
687
|
+
*
|
|
688
|
+
* await db.selectFrom('person')
|
|
642
689
|
* .select('first_name')
|
|
643
690
|
* .modifyEnd(sql`for update`)
|
|
644
691
|
* .execute()
|
|
@@ -656,10 +703,10 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
656
703
|
/**
|
|
657
704
|
* Makes the selection distinct.
|
|
658
705
|
*
|
|
659
|
-
* <!-- siteExample("select", "Distinct", 70) -->
|
|
660
|
-
*
|
|
661
706
|
* ### Examples
|
|
662
707
|
*
|
|
708
|
+
* <!-- siteExample("select", "Distinct", 70) -->
|
|
709
|
+
*
|
|
663
710
|
* ```ts
|
|
664
711
|
* const persons = await db.selectFrom('person')
|
|
665
712
|
* .select('first_name')
|
|
@@ -824,7 +871,10 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
824
871
|
* (join) => join
|
|
825
872
|
* .onRef('pet.owner_id', '=', 'person.id')
|
|
826
873
|
* .on('pet.name', '=', 'Doggo')
|
|
827
|
-
* .on((eb) => eb.or([
|
|
874
|
+
* .on((eb) => eb.or([
|
|
875
|
+
* eb('person.age', '>', 18),
|
|
876
|
+
* eb('person.age', '<', 100)
|
|
877
|
+
* ]))
|
|
828
878
|
* )
|
|
829
879
|
* .selectAll()
|
|
830
880
|
* .execute()
|
|
@@ -838,6 +888,10 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
838
888
|
* inner join "pet"
|
|
839
889
|
* on "pet"."owner_id" = "person"."id"
|
|
840
890
|
* and "pet"."name" = $1
|
|
891
|
+
* and (
|
|
892
|
+
* "person"."age" > $2
|
|
893
|
+
* OR "person"."age" < $3
|
|
894
|
+
* )
|
|
841
895
|
* ```
|
|
842
896
|
*
|
|
843
897
|
* <!-- siteExample("join", "Subquery join", 40) -->
|
|
@@ -895,7 +949,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
895
949
|
* ### Examples
|
|
896
950
|
*
|
|
897
951
|
* ```ts
|
|
898
|
-
* db.selectFrom('person')
|
|
952
|
+
* await db.selectFrom('person')
|
|
899
953
|
* .innerJoinLateral(
|
|
900
954
|
* (eb) =>
|
|
901
955
|
* eb.selectFrom('pet')
|
|
@@ -906,6 +960,20 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
906
960
|
* )
|
|
907
961
|
* .select(['first_name', 'p.name'])
|
|
908
962
|
* .orderBy('first_name')
|
|
963
|
+
* .execute()
|
|
964
|
+
* ```
|
|
965
|
+
*
|
|
966
|
+
* The generated SQL (PostgreSQL):
|
|
967
|
+
*
|
|
968
|
+
* ```sql
|
|
969
|
+
* select "person"."first_name", "p"."name"
|
|
970
|
+
* from "person"
|
|
971
|
+
* inner join lateral (
|
|
972
|
+
* select "name"
|
|
973
|
+
* from "pet"
|
|
974
|
+
* where "pet"."owner_id" = "person"."id"
|
|
975
|
+
* ) as "p" on true
|
|
976
|
+
* order by "first_name"
|
|
909
977
|
* ```
|
|
910
978
|
*/
|
|
911
979
|
innerJoinLateral<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): SelectQueryBuilderWithInnerJoin<DB, TB, O, TE>;
|
|
@@ -915,7 +983,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
915
983
|
* ### Examples
|
|
916
984
|
*
|
|
917
985
|
* ```ts
|
|
918
|
-
* db.selectFrom('person')
|
|
986
|
+
* await db.selectFrom('person')
|
|
919
987
|
* .leftJoinLateral(
|
|
920
988
|
* (eb) =>
|
|
921
989
|
* eb.selectFrom('pet')
|
|
@@ -926,6 +994,20 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
926
994
|
* )
|
|
927
995
|
* .select(['first_name', 'p.name'])
|
|
928
996
|
* .orderBy('first_name')
|
|
997
|
+
* .execute()
|
|
998
|
+
* ```
|
|
999
|
+
*
|
|
1000
|
+
* The generated SQL (PostgreSQL):
|
|
1001
|
+
*
|
|
1002
|
+
* ```sql
|
|
1003
|
+
* select "person"."first_name", "p"."name"
|
|
1004
|
+
* from "person"
|
|
1005
|
+
* left join lateral (
|
|
1006
|
+
* select "name"
|
|
1007
|
+
* from "pet"
|
|
1008
|
+
* where "pet"."owner_id" = "person"."id"
|
|
1009
|
+
* ) as "p" on true
|
|
1010
|
+
* order by "first_name"
|
|
929
1011
|
* ```
|
|
930
1012
|
*/
|
|
931
1013
|
leftJoinLateral<TE extends TableExpression<DB, TB>, K1 extends JoinReferenceExpression<DB, TB, TE>, K2 extends JoinReferenceExpression<DB, TB, TE>>(table: TE, k1: K1, k2: K2): SelectQueryBuilderWithLeftJoin<DB, TB, O, TE>;
|
|
@@ -997,7 +1079,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
997
1079
|
* .limit(1)
|
|
998
1080
|
* )
|
|
999
1081
|
* .orderBy(
|
|
1000
|
-
* sql
|
|
1082
|
+
* sql<string>`concat(first_name, last_name)`
|
|
1001
1083
|
* )
|
|
1002
1084
|
* .execute()
|
|
1003
1085
|
* ```
|
|
@@ -1056,7 +1138,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1056
1138
|
* .selectFrom('person')
|
|
1057
1139
|
* .select([
|
|
1058
1140
|
* 'first_name',
|
|
1059
|
-
* sql
|
|
1141
|
+
* sql<string>`max(id)`.as('max_id')
|
|
1060
1142
|
* ])
|
|
1061
1143
|
* .groupBy('first_name')
|
|
1062
1144
|
* .execute()
|
|
@@ -1080,7 +1162,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1080
1162
|
* .select([
|
|
1081
1163
|
* 'first_name',
|
|
1082
1164
|
* 'last_name',
|
|
1083
|
-
* sql
|
|
1165
|
+
* sql<string>`max(id)`.as('max_id')
|
|
1084
1166
|
* ])
|
|
1085
1167
|
* .groupBy([
|
|
1086
1168
|
* 'first_name',
|
|
@@ -1108,10 +1190,10 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1108
1190
|
* .select([
|
|
1109
1191
|
* 'first_name',
|
|
1110
1192
|
* 'last_name',
|
|
1111
|
-
* sql
|
|
1193
|
+
* sql<string>`max(id)`.as('max_id')
|
|
1112
1194
|
* ])
|
|
1113
1195
|
* .groupBy([
|
|
1114
|
-
* sql
|
|
1196
|
+
* sql<string>`concat(first_name, last_name)`,
|
|
1115
1197
|
* (qb) => qb.selectFrom('pet').select('id').limit(1)
|
|
1116
1198
|
* ])
|
|
1117
1199
|
* .execute()
|
|
@@ -1151,7 +1233,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1151
1233
|
* Select the first 10 rows of the result:
|
|
1152
1234
|
*
|
|
1153
1235
|
* ```ts
|
|
1154
|
-
*
|
|
1236
|
+
* await db
|
|
1155
1237
|
* .selectFrom('person')
|
|
1156
1238
|
* .select('first_name')
|
|
1157
1239
|
* .limit(10)
|
|
@@ -1167,7 +1249,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1167
1249
|
* Select rows from index 10 to index 19 of the result:
|
|
1168
1250
|
*
|
|
1169
1251
|
* ```ts
|
|
1170
|
-
*
|
|
1252
|
+
* await db
|
|
1171
1253
|
* .selectFrom('person')
|
|
1172
1254
|
* .select('first_name')
|
|
1173
1255
|
* .limit(10)
|
|
@@ -1190,7 +1272,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1190
1272
|
* Select rows from index 10 to index 19 of the result:
|
|
1191
1273
|
*
|
|
1192
1274
|
* ```ts
|
|
1193
|
-
*
|
|
1275
|
+
* await db
|
|
1194
1276
|
* .selectFrom('person')
|
|
1195
1277
|
* .select('first_name')
|
|
1196
1278
|
* .limit(10)
|
|
@@ -1213,7 +1295,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1213
1295
|
* ### Examples
|
|
1214
1296
|
*
|
|
1215
1297
|
* ```ts
|
|
1216
|
-
*
|
|
1298
|
+
* await db
|
|
1217
1299
|
* .selectFrom('person')
|
|
1218
1300
|
* .select('first_name')
|
|
1219
1301
|
* .orderBy('first_name')
|
|
@@ -1243,7 +1325,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1243
1325
|
* Select 10 biggest ages:
|
|
1244
1326
|
*
|
|
1245
1327
|
* ```ts
|
|
1246
|
-
*
|
|
1328
|
+
* await db
|
|
1247
1329
|
* .selectFrom('person')
|
|
1248
1330
|
* .select('age')
|
|
1249
1331
|
* .top(10)
|
|
@@ -1260,7 +1342,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1260
1342
|
* Select 10% first rows:
|
|
1261
1343
|
*
|
|
1262
1344
|
* ```ts
|
|
1263
|
-
*
|
|
1345
|
+
* await db
|
|
1264
1346
|
* .selectFrom('person')
|
|
1265
1347
|
* .selectAll()
|
|
1266
1348
|
* .top(10, 'percent')
|
|
@@ -1282,22 +1364,48 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1282
1364
|
* ### Examples
|
|
1283
1365
|
*
|
|
1284
1366
|
* ```ts
|
|
1285
|
-
* db.selectFrom('person')
|
|
1367
|
+
* await db.selectFrom('person')
|
|
1286
1368
|
* .select(['id', 'first_name as name'])
|
|
1287
1369
|
* .union(db.selectFrom('pet').select(['id', 'name']))
|
|
1288
1370
|
* .orderBy('name')
|
|
1371
|
+
* .execute()
|
|
1372
|
+
* ```
|
|
1373
|
+
*
|
|
1374
|
+
* The generated SQL (PostgreSQL):
|
|
1375
|
+
*
|
|
1376
|
+
* ```sql
|
|
1377
|
+
* select "id", "first_name" as "name"
|
|
1378
|
+
* from "person"
|
|
1379
|
+
* union
|
|
1380
|
+
* select "id", "name"
|
|
1381
|
+
* from "pet"
|
|
1382
|
+
* order by "name"
|
|
1289
1383
|
* ```
|
|
1290
1384
|
*
|
|
1291
1385
|
* You can provide a callback to get an expression builder.
|
|
1292
1386
|
* In the following example, this allows us to wrap the query in parentheses:
|
|
1293
1387
|
*
|
|
1294
1388
|
* ```ts
|
|
1295
|
-
* db.selectFrom('person')
|
|
1389
|
+
* await db.selectFrom('person')
|
|
1296
1390
|
* .select(['id', 'first_name as name'])
|
|
1297
1391
|
* .union((eb) => eb.parens(
|
|
1298
1392
|
* eb.selectFrom('pet').select(['id', 'name'])
|
|
1299
1393
|
* ))
|
|
1300
1394
|
* .orderBy('name')
|
|
1395
|
+
* .execute()
|
|
1396
|
+
* ```
|
|
1397
|
+
*
|
|
1398
|
+
* The generated SQL (PostgreSQL):
|
|
1399
|
+
*
|
|
1400
|
+
* ```sql
|
|
1401
|
+
* select "id", "first_name" as "name"
|
|
1402
|
+
* from "person"
|
|
1403
|
+
* union
|
|
1404
|
+
* (
|
|
1405
|
+
* select "id", "name"
|
|
1406
|
+
* from "pet"
|
|
1407
|
+
* )
|
|
1408
|
+
* order by "name"
|
|
1301
1409
|
* ```
|
|
1302
1410
|
*/
|
|
1303
1411
|
union<E extends SetOperandExpression<DB, O>>(expression: E): SelectQueryBuilder<DB, TB, O>;
|
|
@@ -1309,22 +1417,48 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1309
1417
|
* ### Examples
|
|
1310
1418
|
*
|
|
1311
1419
|
* ```ts
|
|
1312
|
-
* db.selectFrom('person')
|
|
1420
|
+
* await db.selectFrom('person')
|
|
1313
1421
|
* .select(['id', 'first_name as name'])
|
|
1314
1422
|
* .unionAll(db.selectFrom('pet').select(['id', 'name']))
|
|
1315
1423
|
* .orderBy('name')
|
|
1424
|
+
* .execute()
|
|
1425
|
+
* ```
|
|
1426
|
+
*
|
|
1427
|
+
* The generated SQL (PostgreSQL):
|
|
1428
|
+
*
|
|
1429
|
+
* ```sql
|
|
1430
|
+
* select "id", "first_name" as "name"
|
|
1431
|
+
* from "person"
|
|
1432
|
+
* union all
|
|
1433
|
+
* select "id", "name"
|
|
1434
|
+
* from "pet"
|
|
1435
|
+
* order by "name"
|
|
1316
1436
|
* ```
|
|
1317
1437
|
*
|
|
1318
1438
|
* You can provide a callback to get an expression builder.
|
|
1319
1439
|
* In the following example, this allows us to wrap the query in parentheses:
|
|
1320
1440
|
*
|
|
1321
1441
|
* ```ts
|
|
1322
|
-
* db.selectFrom('person')
|
|
1442
|
+
* await db.selectFrom('person')
|
|
1323
1443
|
* .select(['id', 'first_name as name'])
|
|
1324
1444
|
* .unionAll((eb) => eb.parens(
|
|
1325
1445
|
* eb.selectFrom('pet').select(['id', 'name'])
|
|
1326
1446
|
* ))
|
|
1327
1447
|
* .orderBy('name')
|
|
1448
|
+
* .execute()
|
|
1449
|
+
* ```
|
|
1450
|
+
*
|
|
1451
|
+
* The generated SQL (PostgreSQL):
|
|
1452
|
+
*
|
|
1453
|
+
* ```sql
|
|
1454
|
+
* select "id", "first_name" as "name"
|
|
1455
|
+
* from "person"
|
|
1456
|
+
* union all
|
|
1457
|
+
* (
|
|
1458
|
+
* select "id", "name"
|
|
1459
|
+
* from "pet"
|
|
1460
|
+
* )
|
|
1461
|
+
* order by "name"
|
|
1328
1462
|
* ```
|
|
1329
1463
|
*/
|
|
1330
1464
|
unionAll<E extends SetOperandExpression<DB, O>>(expression: E): SelectQueryBuilder<DB, TB, O>;
|
|
@@ -1336,22 +1470,48 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1336
1470
|
* ### Examples
|
|
1337
1471
|
*
|
|
1338
1472
|
* ```ts
|
|
1339
|
-
* db.selectFrom('person')
|
|
1473
|
+
* await db.selectFrom('person')
|
|
1340
1474
|
* .select(['id', 'first_name as name'])
|
|
1341
1475
|
* .intersect(db.selectFrom('pet').select(['id', 'name']))
|
|
1342
1476
|
* .orderBy('name')
|
|
1477
|
+
* .execute()
|
|
1478
|
+
* ```
|
|
1479
|
+
*
|
|
1480
|
+
* The generated SQL (PostgreSQL):
|
|
1481
|
+
*
|
|
1482
|
+
* ```sql
|
|
1483
|
+
* select "id", "first_name" as "name"
|
|
1484
|
+
* from "person"
|
|
1485
|
+
* intersect
|
|
1486
|
+
* select "id", "name"
|
|
1487
|
+
* from "pet"
|
|
1488
|
+
* order by "name"
|
|
1343
1489
|
* ```
|
|
1344
1490
|
*
|
|
1345
1491
|
* You can provide a callback to get an expression builder.
|
|
1346
1492
|
* In the following example, this allows us to wrap the query in parentheses:
|
|
1347
1493
|
*
|
|
1348
1494
|
* ```ts
|
|
1349
|
-
* db.selectFrom('person')
|
|
1495
|
+
* await db.selectFrom('person')
|
|
1350
1496
|
* .select(['id', 'first_name as name'])
|
|
1351
1497
|
* .intersect((eb) => eb.parens(
|
|
1352
1498
|
* eb.selectFrom('pet').select(['id', 'name'])
|
|
1353
1499
|
* ))
|
|
1354
1500
|
* .orderBy('name')
|
|
1501
|
+
* .execute()
|
|
1502
|
+
* ```
|
|
1503
|
+
*
|
|
1504
|
+
* The generated SQL (PostgreSQL):
|
|
1505
|
+
*
|
|
1506
|
+
* ```sql
|
|
1507
|
+
* select "id", "first_name" as "name"
|
|
1508
|
+
* from "person"
|
|
1509
|
+
* intersect
|
|
1510
|
+
* (
|
|
1511
|
+
* select "id", "name"
|
|
1512
|
+
* from "pet"
|
|
1513
|
+
* )
|
|
1514
|
+
* order by "name"
|
|
1355
1515
|
* ```
|
|
1356
1516
|
*/
|
|
1357
1517
|
intersect<E extends SetOperandExpression<DB, O>>(expression: E): SelectQueryBuilder<DB, TB, O>;
|
|
@@ -1363,22 +1523,48 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1363
1523
|
* ### Examples
|
|
1364
1524
|
*
|
|
1365
1525
|
* ```ts
|
|
1366
|
-
* db.selectFrom('person')
|
|
1526
|
+
* await db.selectFrom('person')
|
|
1367
1527
|
* .select(['id', 'first_name as name'])
|
|
1368
1528
|
* .intersectAll(db.selectFrom('pet').select(['id', 'name']))
|
|
1369
1529
|
* .orderBy('name')
|
|
1530
|
+
* .execute()
|
|
1531
|
+
* ```
|
|
1532
|
+
*
|
|
1533
|
+
* The generated SQL (PostgreSQL):
|
|
1534
|
+
*
|
|
1535
|
+
* ```sql
|
|
1536
|
+
* select "id", "first_name" as "name"
|
|
1537
|
+
* from "person"
|
|
1538
|
+
* intersect all
|
|
1539
|
+
* select "id", "name"
|
|
1540
|
+
* from "pet"
|
|
1541
|
+
* order by "name"
|
|
1370
1542
|
* ```
|
|
1371
1543
|
*
|
|
1372
1544
|
* You can provide a callback to get an expression builder.
|
|
1373
1545
|
* In the following example, this allows us to wrap the query in parentheses:
|
|
1374
1546
|
*
|
|
1375
1547
|
* ```ts
|
|
1376
|
-
* db.selectFrom('person')
|
|
1548
|
+
* await db.selectFrom('person')
|
|
1377
1549
|
* .select(['id', 'first_name as name'])
|
|
1378
1550
|
* .intersectAll((eb) => eb.parens(
|
|
1379
1551
|
* eb.selectFrom('pet').select(['id', 'name'])
|
|
1380
1552
|
* ))
|
|
1381
1553
|
* .orderBy('name')
|
|
1554
|
+
* .execute()
|
|
1555
|
+
* ```
|
|
1556
|
+
*
|
|
1557
|
+
* The generated SQL (PostgreSQL):
|
|
1558
|
+
*
|
|
1559
|
+
* ```sql
|
|
1560
|
+
* select "id", "first_name" as "name"
|
|
1561
|
+
* from "person"
|
|
1562
|
+
* intersect all
|
|
1563
|
+
* (
|
|
1564
|
+
* select "id", "name"
|
|
1565
|
+
* from "pet"
|
|
1566
|
+
* )
|
|
1567
|
+
* order by "name"
|
|
1382
1568
|
* ```
|
|
1383
1569
|
*/
|
|
1384
1570
|
intersectAll<E extends SetOperandExpression<DB, O>>(expression: E): SelectQueryBuilder<DB, TB, O>;
|
|
@@ -1390,22 +1576,48 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1390
1576
|
* ### Examples
|
|
1391
1577
|
*
|
|
1392
1578
|
* ```ts
|
|
1393
|
-
* db.selectFrom('person')
|
|
1579
|
+
* await db.selectFrom('person')
|
|
1394
1580
|
* .select(['id', 'first_name as name'])
|
|
1395
1581
|
* .except(db.selectFrom('pet').select(['id', 'name']))
|
|
1396
1582
|
* .orderBy('name')
|
|
1583
|
+
* .execute()
|
|
1584
|
+
* ```
|
|
1585
|
+
*
|
|
1586
|
+
* The generated SQL (PostgreSQL):
|
|
1587
|
+
*
|
|
1588
|
+
* ```sql
|
|
1589
|
+
* select "id", "first_name" as "name"
|
|
1590
|
+
* from "person"
|
|
1591
|
+
* except
|
|
1592
|
+
* select "id", "name"
|
|
1593
|
+
* from "pet"
|
|
1594
|
+
* order by "name"
|
|
1397
1595
|
* ```
|
|
1398
1596
|
*
|
|
1399
1597
|
* You can provide a callback to get an expression builder.
|
|
1400
1598
|
* In the following example, this allows us to wrap the query in parentheses:
|
|
1401
1599
|
*
|
|
1402
1600
|
* ```ts
|
|
1403
|
-
* db.selectFrom('person')
|
|
1601
|
+
* await db.selectFrom('person')
|
|
1404
1602
|
* .select(['id', 'first_name as name'])
|
|
1405
1603
|
* .except((eb) => eb.parens(
|
|
1406
1604
|
* eb.selectFrom('pet').select(['id', 'name'])
|
|
1407
1605
|
* ))
|
|
1408
1606
|
* .orderBy('name')
|
|
1607
|
+
* .execute()
|
|
1608
|
+
* ```
|
|
1609
|
+
*
|
|
1610
|
+
* The generated SQL (PostgreSQL):
|
|
1611
|
+
*
|
|
1612
|
+
* ```sql
|
|
1613
|
+
* select "id", "first_name" as "name"
|
|
1614
|
+
* from "person"
|
|
1615
|
+
* except
|
|
1616
|
+
* (
|
|
1617
|
+
* select "id", "name"
|
|
1618
|
+
* from "pet"
|
|
1619
|
+
* )
|
|
1620
|
+
* order by "name"
|
|
1409
1621
|
* ```
|
|
1410
1622
|
*/
|
|
1411
1623
|
except<E extends SetOperandExpression<DB, O>>(expression: E): SelectQueryBuilder<DB, TB, O>;
|
|
@@ -1417,22 +1629,48 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1417
1629
|
* ### Examples
|
|
1418
1630
|
*
|
|
1419
1631
|
* ```ts
|
|
1420
|
-
* db.selectFrom('person')
|
|
1632
|
+
* await db.selectFrom('person')
|
|
1421
1633
|
* .select(['id', 'first_name as name'])
|
|
1422
1634
|
* .exceptAll(db.selectFrom('pet').select(['id', 'name']))
|
|
1423
1635
|
* .orderBy('name')
|
|
1636
|
+
* .execute()
|
|
1637
|
+
* ```
|
|
1638
|
+
*
|
|
1639
|
+
* The generated SQL (PostgreSQL):
|
|
1640
|
+
*
|
|
1641
|
+
* ```sql
|
|
1642
|
+
* select "id", "first_name" as "name"
|
|
1643
|
+
* from "person"
|
|
1644
|
+
* except all
|
|
1645
|
+
* select "id", "name"
|
|
1646
|
+
* from "pet"
|
|
1647
|
+
* order by "name"
|
|
1424
1648
|
* ```
|
|
1425
1649
|
*
|
|
1426
1650
|
* You can provide a callback to get an expression builder.
|
|
1427
1651
|
* In the following example, this allows us to wrap the query in parentheses:
|
|
1428
1652
|
*
|
|
1429
1653
|
* ```ts
|
|
1430
|
-
* db.selectFrom('person')
|
|
1654
|
+
* await db.selectFrom('person')
|
|
1431
1655
|
* .select(['id', 'first_name as name'])
|
|
1432
1656
|
* .exceptAll((eb) => eb.parens(
|
|
1433
1657
|
* eb.selectFrom('pet').select(['id', 'name'])
|
|
1434
1658
|
* ))
|
|
1435
1659
|
* .orderBy('name')
|
|
1660
|
+
* .execute()
|
|
1661
|
+
* ```
|
|
1662
|
+
*
|
|
1663
|
+
* The generated SQL (PostgreSQL):
|
|
1664
|
+
*
|
|
1665
|
+
* ```sql
|
|
1666
|
+
* select "id", "first_name" as "name"
|
|
1667
|
+
* from "person"
|
|
1668
|
+
* except all
|
|
1669
|
+
* (
|
|
1670
|
+
* select "id", "name"
|
|
1671
|
+
* from "pet"
|
|
1672
|
+
* )
|
|
1673
|
+
* order by "name"
|
|
1436
1674
|
* ```
|
|
1437
1675
|
*/
|
|
1438
1676
|
exceptAll<E extends SetOperandExpression<DB, O>>(expression: E): SelectQueryBuilder<DB, TB, O>;
|
|
@@ -1454,6 +1692,17 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1454
1692
|
*
|
|
1455
1693
|
* pets[0].owner_first_name
|
|
1456
1694
|
* ```
|
|
1695
|
+
*
|
|
1696
|
+
* The generated SQL (PostgreSQL):
|
|
1697
|
+
*
|
|
1698
|
+
* ```sql
|
|
1699
|
+
* select "pet".*, (
|
|
1700
|
+
* select "first_name"
|
|
1701
|
+
* from "person"
|
|
1702
|
+
* where "pet"."owner_id" = "person"."id"
|
|
1703
|
+
* ) as "owner_first_name"
|
|
1704
|
+
* from "pet"
|
|
1705
|
+
* ```
|
|
1457
1706
|
*/
|
|
1458
1707
|
as<A extends string>(alias: A): AliasedSelectQueryBuilder<O, A>;
|
|
1459
1708
|
/**
|
|
@@ -1462,10 +1711,11 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1462
1711
|
* ### Examples
|
|
1463
1712
|
*
|
|
1464
1713
|
* ```ts
|
|
1465
|
-
* db.selectFrom('person')
|
|
1714
|
+
* await db.selectFrom('person')
|
|
1466
1715
|
* .select(['id', 'first_name'])
|
|
1467
1716
|
* .clearSelect()
|
|
1468
1717
|
* .select(['id', 'gender'])
|
|
1718
|
+
* .execute()
|
|
1469
1719
|
* ```
|
|
1470
1720
|
*
|
|
1471
1721
|
* The generated SQL(PostgreSQL):
|
|
@@ -1500,10 +1750,11 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1500
1750
|
* ### Examples
|
|
1501
1751
|
*
|
|
1502
1752
|
* ```ts
|
|
1503
|
-
* db.selectFrom('person')
|
|
1753
|
+
* await db.selectFrom('person')
|
|
1504
1754
|
* .selectAll()
|
|
1505
1755
|
* .limit(10)
|
|
1506
1756
|
* .clearLimit()
|
|
1757
|
+
* .execute()
|
|
1507
1758
|
* ```
|
|
1508
1759
|
*
|
|
1509
1760
|
* The generated SQL(PostgreSQL):
|
|
@@ -1519,11 +1770,12 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1519
1770
|
* ### Examples
|
|
1520
1771
|
*
|
|
1521
1772
|
* ```ts
|
|
1522
|
-
* db.selectFrom('person')
|
|
1773
|
+
* await db.selectFrom('person')
|
|
1523
1774
|
* .selectAll()
|
|
1524
1775
|
* .limit(10)
|
|
1525
1776
|
* .offset(20)
|
|
1526
1777
|
* .clearOffset()
|
|
1778
|
+
* .execute()
|
|
1527
1779
|
* ```
|
|
1528
1780
|
*
|
|
1529
1781
|
* The generated SQL(PostgreSQL):
|
|
@@ -1539,10 +1791,11 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1539
1791
|
* ### Examples
|
|
1540
1792
|
*
|
|
1541
1793
|
* ```ts
|
|
1542
|
-
* db.selectFrom('person')
|
|
1794
|
+
* await db.selectFrom('person')
|
|
1543
1795
|
* .selectAll()
|
|
1544
1796
|
* .orderBy('id')
|
|
1545
1797
|
* .clearOrderBy()
|
|
1798
|
+
* .execute()
|
|
1546
1799
|
* ```
|
|
1547
1800
|
*
|
|
1548
1801
|
* The generated SQL(PostgreSQL):
|
|
@@ -1552,6 +1805,26 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1552
1805
|
* ```
|
|
1553
1806
|
*/
|
|
1554
1807
|
clearOrderBy(): SelectQueryBuilder<DB, TB, O>;
|
|
1808
|
+
/**
|
|
1809
|
+
* Clears `group by` clause from the query.
|
|
1810
|
+
*
|
|
1811
|
+
* ### Examples
|
|
1812
|
+
*
|
|
1813
|
+
* ```ts
|
|
1814
|
+
* await db.selectFrom('person')
|
|
1815
|
+
* .selectAll()
|
|
1816
|
+
* .groupBy('id')
|
|
1817
|
+
* .clearGroupBy()
|
|
1818
|
+
* .execute()
|
|
1819
|
+
* ```
|
|
1820
|
+
*
|
|
1821
|
+
* The generated SQL(PostgreSQL):
|
|
1822
|
+
*
|
|
1823
|
+
* ```sql
|
|
1824
|
+
* select * from "person"
|
|
1825
|
+
* ```
|
|
1826
|
+
*/
|
|
1827
|
+
clearGroupBy(): SelectQueryBuilder<DB, TB, O>;
|
|
1555
1828
|
/**
|
|
1556
1829
|
* Simply calls the provided function passing `this` as the only argument. `$call` returns
|
|
1557
1830
|
* what the provided function returns.
|
|
@@ -1564,12 +1837,14 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1564
1837
|
* The next example uses a helper function `log` to log a query:
|
|
1565
1838
|
*
|
|
1566
1839
|
* ```ts
|
|
1840
|
+
* import type { Compilable } from 'kysely'
|
|
1841
|
+
*
|
|
1567
1842
|
* function log<T extends Compilable>(qb: T): T {
|
|
1568
1843
|
* console.log(qb.compile())
|
|
1569
1844
|
* return qb
|
|
1570
1845
|
* }
|
|
1571
1846
|
*
|
|
1572
|
-
* db.selectFrom('person')
|
|
1847
|
+
* await db.selectFrom('person')
|
|
1573
1848
|
* .selectAll()
|
|
1574
1849
|
* .$call(log)
|
|
1575
1850
|
* .execute()
|
|
@@ -1579,29 +1854,31 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1579
1854
|
/**
|
|
1580
1855
|
* Call `func(this)` if `condition` is true.
|
|
1581
1856
|
*
|
|
1582
|
-
* NOTE: This method has an impact on
|
|
1857
|
+
* NOTE: This method has an impact on TypeScript performance and it should only be used
|
|
1583
1858
|
* when necessary. Remember that you can call most methods like `where` conditionally
|
|
1584
1859
|
* like this:
|
|
1585
1860
|
*
|
|
1586
1861
|
* ```ts
|
|
1587
|
-
*
|
|
1862
|
+
* async function getPeople(firstName?: string, lastName?: string) {
|
|
1863
|
+
* let query = db.selectFrom('person').selectAll()
|
|
1588
1864
|
*
|
|
1589
|
-
*
|
|
1590
|
-
*
|
|
1591
|
-
*
|
|
1865
|
+
* if (firstName) {
|
|
1866
|
+
* query = query.where('first_name', '=', firstName)
|
|
1867
|
+
* }
|
|
1592
1868
|
*
|
|
1593
|
-
*
|
|
1594
|
-
*
|
|
1595
|
-
*
|
|
1869
|
+
* if (lastName) {
|
|
1870
|
+
* query = query.where('last_name', '=', lastName)
|
|
1871
|
+
* }
|
|
1596
1872
|
*
|
|
1597
|
-
*
|
|
1873
|
+
* return await query.execute()
|
|
1874
|
+
* }
|
|
1598
1875
|
* ```
|
|
1599
1876
|
*
|
|
1600
1877
|
* This method is mainly useful with optional selects. Any `select` or `selectAll`
|
|
1601
1878
|
* method called inside the callback add optional fields to the result type. This is
|
|
1602
1879
|
* because we can't know if those selections were actually made before running the code.
|
|
1603
1880
|
*
|
|
1604
|
-
* Also see [this recipe](https://github.com/
|
|
1881
|
+
* Also see [this recipe](https://github.com/kysely-org/kysely/blob/master/site/docs/recipes/0005-conditional-selects.md)
|
|
1605
1882
|
*
|
|
1606
1883
|
* ### Examples
|
|
1607
1884
|
*
|
|
@@ -1621,24 +1898,27 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1621
1898
|
* the code. In the example above the return type of the `getPerson` function is:
|
|
1622
1899
|
*
|
|
1623
1900
|
* ```ts
|
|
1624
|
-
* {
|
|
1901
|
+
* Promise<{
|
|
1625
1902
|
* id: number
|
|
1626
1903
|
* first_name: string
|
|
1627
1904
|
* last_name?: string
|
|
1628
|
-
* }
|
|
1905
|
+
* }>
|
|
1629
1906
|
* ```
|
|
1630
1907
|
*
|
|
1631
1908
|
* You can also call any other methods inside the callback:
|
|
1632
1909
|
*
|
|
1633
1910
|
* ```ts
|
|
1634
|
-
*
|
|
1635
|
-
* .
|
|
1636
|
-
*
|
|
1637
|
-
*
|
|
1638
|
-
*
|
|
1639
|
-
*
|
|
1640
|
-
*
|
|
1641
|
-
*
|
|
1911
|
+
* async function getPeople(firstName?: string, petCountLimit?: number) {
|
|
1912
|
+
* return await db.selectFrom('person')
|
|
1913
|
+
* .select('person.id')
|
|
1914
|
+
* .$if(firstName != null, (qb) => qb.where('first_name', '=', firstName!))
|
|
1915
|
+
* .$if(petCountLimit != null, (qb) => qb
|
|
1916
|
+
* .innerJoin('pet', 'pet.owner_id', 'person.id')
|
|
1917
|
+
* .having((eb) => eb.fn.count('pet.id'), '>', petCountLimit!)
|
|
1918
|
+
* .groupBy('person.id')
|
|
1919
|
+
* )
|
|
1920
|
+
* .execute()
|
|
1921
|
+
* }
|
|
1642
1922
|
* ```
|
|
1643
1923
|
*/
|
|
1644
1924
|
$if<O2>(condition: boolean, func: (qb: this) => SelectQueryBuilder<any, any, O & O2>): SelectQueryBuilder<DB, TB, O & Partial<Omit<O2, keyof O>>>;
|
|
@@ -1674,6 +1954,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1674
1954
|
* .where('pet.species', '!=', 'cat')
|
|
1675
1955
|
* .$asTuple('name', 'species')
|
|
1676
1956
|
* ))
|
|
1957
|
+
* .execute()
|
|
1677
1958
|
* ```
|
|
1678
1959
|
*
|
|
1679
1960
|
* The generated SQL(PostgreSQL):
|
|
@@ -1715,23 +1996,31 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1715
1996
|
* Turn this code:
|
|
1716
1997
|
*
|
|
1717
1998
|
* ```ts
|
|
1999
|
+
* import type { Person } from 'type-editor' // imaginary module
|
|
2000
|
+
*
|
|
1718
2001
|
* const person = await db.selectFrom('person')
|
|
1719
2002
|
* .where('nullable_column', 'is not', null)
|
|
1720
2003
|
* .selectAll()
|
|
1721
2004
|
* .executeTakeFirstOrThrow()
|
|
1722
2005
|
*
|
|
1723
|
-
* if (person
|
|
2006
|
+
* if (isWithNoNullValue(person)) {
|
|
1724
2007
|
* functionThatExpectsPersonWithNonNullValue(person)
|
|
1725
2008
|
* }
|
|
2009
|
+
*
|
|
2010
|
+
* function isWithNoNullValue(person: Person): person is Person & { nullable_column: string } {
|
|
2011
|
+
* return person.nullable_column != null
|
|
2012
|
+
* }
|
|
1726
2013
|
* ```
|
|
1727
2014
|
*
|
|
1728
2015
|
* Into this:
|
|
1729
2016
|
*
|
|
1730
2017
|
* ```ts
|
|
2018
|
+
* import type { NotNull } from 'kysely'
|
|
2019
|
+
*
|
|
1731
2020
|
* const person = await db.selectFrom('person')
|
|
1732
2021
|
* .where('nullable_column', 'is not', null)
|
|
1733
2022
|
* .selectAll()
|
|
1734
|
-
* .$narrowType<{ nullable_column:
|
|
2023
|
+
* .$narrowType<{ nullable_column: NotNull }>()
|
|
1735
2024
|
* .executeTakeFirstOrThrow()
|
|
1736
2025
|
*
|
|
1737
2026
|
* functionThatExpectsPersonWithNonNullValue(person)
|
|
@@ -1757,17 +2046,17 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1757
2046
|
/**
|
|
1758
2047
|
* Asserts that query's output row type equals the given type `T`.
|
|
1759
2048
|
*
|
|
1760
|
-
* This method can be used to simplify excessively complex types to make
|
|
2049
|
+
* This method can be used to simplify excessively complex types to make TypeScript happy
|
|
1761
2050
|
* and much faster.
|
|
1762
2051
|
*
|
|
1763
2052
|
* Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
|
|
1764
|
-
* for
|
|
2053
|
+
* for TypeScript and you get errors like this:
|
|
1765
2054
|
*
|
|
1766
2055
|
* ```
|
|
1767
2056
|
* error TS2589: Type instantiation is excessively deep and possibly infinite.
|
|
1768
2057
|
* ```
|
|
1769
2058
|
*
|
|
1770
|
-
* In these case you can often use this method to help
|
|
2059
|
+
* In these case you can often use this method to help TypeScript a little bit. When you use this
|
|
1771
2060
|
* method to assert the output type of a query, Kysely can drop the complex output type that
|
|
1772
2061
|
* consists of multiple nested helper types and replace it with the simple asserted type.
|
|
1773
2062
|
*
|
|
@@ -1781,12 +2070,12 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1781
2070
|
* .with('first_and_last', (qb) => qb
|
|
1782
2071
|
* .selectFrom('person')
|
|
1783
2072
|
* .select(['first_name', 'last_name'])
|
|
1784
|
-
* .$assertType<{ first_name: string, last_name: string }>()
|
|
2073
|
+
* .$assertType<{ first_name: string, last_name: string | null }>()
|
|
1785
2074
|
* )
|
|
1786
2075
|
* .with('age', (qb) => qb
|
|
1787
2076
|
* .selectFrom('person')
|
|
1788
2077
|
* .select('age')
|
|
1789
|
-
* .$assertType<{ age: number }>()
|
|
2078
|
+
* .$assertType<{ age: number | null }>()
|
|
1790
2079
|
* )
|
|
1791
2080
|
* .selectFrom(['first_and_last', 'age'])
|
|
1792
2081
|
* .selectAll()
|
|
@@ -1801,11 +2090,19 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1801
2090
|
/**
|
|
1802
2091
|
* Creates the OperationNode that describes how to compile this expression into SQL.
|
|
1803
2092
|
*
|
|
2093
|
+
* ### Examples
|
|
2094
|
+
*
|
|
1804
2095
|
* If you are creating a custom expression, it's often easiest to use the {@link sql}
|
|
1805
2096
|
* template tag to build the node:
|
|
1806
2097
|
*
|
|
1807
2098
|
* ```ts
|
|
2099
|
+
* import { type Expression, type OperationNode, sql } from 'kysely'
|
|
2100
|
+
*
|
|
1808
2101
|
* class SomeExpression<T> implements Expression<T> {
|
|
2102
|
+
* get expressionType(): T | undefined {
|
|
2103
|
+
* return undefined
|
|
2104
|
+
* }
|
|
2105
|
+
*
|
|
1809
2106
|
* toOperationNode(): OperationNode {
|
|
1810
2107
|
* return sql`some sql here`.toOperationNode()
|
|
1811
2108
|
* }
|
|
@@ -1843,7 +2140,7 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1843
2140
|
* ### Examples
|
|
1844
2141
|
*
|
|
1845
2142
|
* ```ts
|
|
1846
|
-
* const stream = db
|
|
2143
|
+
* const stream = db
|
|
1847
2144
|
* .selectFrom('person')
|
|
1848
2145
|
* .select(['first_name', 'last_name'])
|
|
1849
2146
|
* .where('gender', '=', 'other')
|