knex 2.4.2 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/CHANGELOG.md +54 -18
  2. package/CONTRIBUTING.md +194 -194
  3. package/LICENSE +22 -22
  4. package/README.md +147 -148
  5. package/UPGRADING.md +233 -233
  6. package/bin/cli.js +473 -473
  7. package/bin/utils/cli-config-utils.js +210 -210
  8. package/bin/utils/constants.js +7 -7
  9. package/bin/utils/migrationsLister.js +37 -37
  10. package/knex.js +23 -23
  11. package/knex.mjs +11 -0
  12. package/lib/builder-interface-augmenter.js +120 -120
  13. package/lib/client.js +495 -475
  14. package/lib/constants.js +61 -61
  15. package/lib/dialects/better-sqlite3/index.js +77 -72
  16. package/lib/dialects/cockroachdb/crdb-columncompiler.js +14 -14
  17. package/lib/dialects/cockroachdb/crdb-querybuilder.js +11 -11
  18. package/lib/dialects/cockroachdb/crdb-querycompiler.js +122 -122
  19. package/lib/dialects/cockroachdb/crdb-tablecompiler.js +37 -37
  20. package/lib/dialects/cockroachdb/crdb-viewcompiler.js +15 -15
  21. package/lib/dialects/cockroachdb/index.js +86 -86
  22. package/lib/dialects/index.js +33 -33
  23. package/lib/dialects/mssql/index.js +500 -495
  24. package/lib/dialects/mssql/mssql-formatter.js +34 -34
  25. package/lib/dialects/mssql/query/mssql-querycompiler.js +601 -600
  26. package/lib/dialects/mssql/schema/mssql-columncompiler.js +185 -185
  27. package/lib/dialects/mssql/schema/mssql-compiler.js +91 -91
  28. package/lib/dialects/mssql/schema/mssql-tablecompiler.js +378 -378
  29. package/lib/dialects/mssql/schema/mssql-viewcompiler.js +55 -55
  30. package/lib/dialects/mssql/transaction.js +176 -176
  31. package/lib/dialects/mysql/index.js +201 -201
  32. package/lib/dialects/mysql/query/mysql-querycompiler.js +274 -274
  33. package/lib/dialects/mysql/schema/mysql-columncompiler.js +193 -193
  34. package/lib/dialects/mysql/schema/mysql-compiler.js +60 -60
  35. package/lib/dialects/mysql/schema/mysql-tablecompiler.js +381 -381
  36. package/lib/dialects/mysql/schema/mysql-viewbuilder.js +21 -21
  37. package/lib/dialects/mysql/schema/mysql-viewcompiler.js +15 -15
  38. package/lib/dialects/mysql/transaction.js +46 -46
  39. package/lib/dialects/mysql2/index.js +53 -33
  40. package/lib/dialects/mysql2/transaction.js +44 -44
  41. package/lib/dialects/oracle/DEAD_CODE.md +5 -5
  42. package/lib/dialects/oracle/index.js +92 -92
  43. package/lib/dialects/oracle/query/oracle-querycompiler.js +343 -342
  44. package/lib/dialects/oracle/schema/internal/incrementUtils.js +20 -20
  45. package/lib/dialects/oracle/schema/internal/trigger.js +135 -135
  46. package/lib/dialects/oracle/schema/oracle-columnbuilder.js +17 -17
  47. package/lib/dialects/oracle/schema/oracle-columncompiler.js +126 -126
  48. package/lib/dialects/oracle/schema/oracle-compiler.js +122 -122
  49. package/lib/dialects/oracle/schema/oracle-tablecompiler.js +190 -190
  50. package/lib/dialects/oracle/utils.js +87 -87
  51. package/lib/dialects/oracledb/index.js +327 -327
  52. package/lib/dialects/oracledb/query/oracledb-querycompiler.js +481 -481
  53. package/lib/dialects/oracledb/schema/oracledb-columncompiler.js +61 -55
  54. package/lib/dialects/oracledb/schema/oracledb-tablecompiler.js +19 -19
  55. package/lib/dialects/oracledb/schema/oracledb-viewbuilder.js +13 -13
  56. package/lib/dialects/oracledb/schema/oracledb-viewcompiler.js +19 -19
  57. package/lib/dialects/oracledb/transaction.js +98 -98
  58. package/lib/dialects/oracledb/utils.js +208 -208
  59. package/lib/dialects/pgnative/index.js +60 -60
  60. package/lib/dialects/postgres/execution/pg-transaction.js +19 -12
  61. package/lib/dialects/postgres/index.js +358 -358
  62. package/lib/dialects/postgres/query/pg-querybuilder.js +43 -38
  63. package/lib/dialects/postgres/query/pg-querycompiler.js +400 -395
  64. package/lib/dialects/postgres/schema/pg-columncompiler.js +156 -156
  65. package/lib/dialects/postgres/schema/pg-compiler.js +138 -138
  66. package/lib/dialects/postgres/schema/pg-tablecompiler.js +304 -299
  67. package/lib/dialects/postgres/schema/pg-viewbuilder.js +21 -21
  68. package/lib/dialects/postgres/schema/pg-viewcompiler.js +35 -35
  69. package/lib/dialects/redshift/index.js +86 -86
  70. package/lib/dialects/redshift/query/redshift-querycompiler.js +163 -163
  71. package/lib/dialects/redshift/schema/redshift-columnbuilder.js +22 -22
  72. package/lib/dialects/redshift/schema/redshift-columncompiler.js +67 -67
  73. package/lib/dialects/redshift/schema/redshift-compiler.js +14 -14
  74. package/lib/dialects/redshift/schema/redshift-tablecompiler.js +122 -122
  75. package/lib/dialects/redshift/schema/redshift-viewcompiler.js +11 -11
  76. package/lib/dialects/redshift/transaction.js +32 -25
  77. package/lib/dialects/sqlite3/execution/sqlite-transaction.js +25 -18
  78. package/lib/dialects/sqlite3/index.js +250 -250
  79. package/lib/dialects/sqlite3/query/sqlite-querybuilder.js +33 -33
  80. package/lib/dialects/sqlite3/query/sqlite-querycompiler.js +334 -334
  81. package/lib/dialects/sqlite3/schema/ddl.js +400 -400
  82. package/lib/dialects/sqlite3/schema/internal/compiler.js +327 -327
  83. package/lib/dialects/sqlite3/schema/internal/parser-combinator.js +161 -161
  84. package/lib/dialects/sqlite3/schema/internal/parser.js +638 -638
  85. package/lib/dialects/sqlite3/schema/internal/sqlite-ddl-operations.js +41 -41
  86. package/lib/dialects/sqlite3/schema/internal/tokenizer.js +38 -38
  87. package/lib/dialects/sqlite3/schema/internal/utils.js +12 -12
  88. package/lib/dialects/sqlite3/schema/sqlite-columncompiler.js +50 -50
  89. package/lib/dialects/sqlite3/schema/sqlite-compiler.js +80 -80
  90. package/lib/dialects/sqlite3/schema/sqlite-tablecompiler.js +347 -347
  91. package/lib/dialects/sqlite3/schema/sqlite-viewcompiler.js +40 -40
  92. package/lib/execution/batch-insert.js +51 -51
  93. package/lib/execution/internal/delay.js +6 -6
  94. package/lib/execution/internal/ensure-connection-callback.js +41 -41
  95. package/lib/execution/internal/query-executioner.js +62 -62
  96. package/lib/execution/runner.js +325 -307
  97. package/lib/execution/transaction.js +409 -401
  98. package/lib/formatter/formatterUtils.js +42 -42
  99. package/lib/formatter/rawFormatter.js +84 -84
  100. package/lib/formatter/wrappingFormatter.js +250 -250
  101. package/lib/formatter.js +25 -25
  102. package/lib/index.js +3 -3
  103. package/lib/knex-builder/FunctionHelper.js +80 -54
  104. package/lib/knex-builder/Knex.js +59 -59
  105. package/lib/knex-builder/internal/config-resolver.js +57 -57
  106. package/lib/knex-builder/internal/parse-connection.js +87 -87
  107. package/lib/knex-builder/make-knex.js +345 -340
  108. package/lib/logger.js +76 -76
  109. package/lib/migrations/common/MigrationsLoader.js +36 -36
  110. package/lib/migrations/migrate/MigrationGenerator.js +84 -84
  111. package/lib/migrations/migrate/Migrator.js +598 -598
  112. package/lib/migrations/migrate/migrate-stub.js +17 -17
  113. package/lib/migrations/migrate/migration-list-resolver.js +33 -33
  114. package/lib/migrations/migrate/migrator-configuration-merger.js +58 -58
  115. package/lib/migrations/migrate/sources/fs-migrations.js +74 -74
  116. package/lib/migrations/migrate/stub/cjs.stub +15 -15
  117. package/lib/migrations/migrate/stub/coffee.stub +13 -13
  118. package/lib/migrations/migrate/stub/eg.stub +14 -14
  119. package/lib/migrations/migrate/stub/js-schema.stub +22 -22
  120. package/lib/migrations/migrate/stub/js.stub +22 -22
  121. package/lib/migrations/migrate/stub/knexfile-coffee.stub +34 -34
  122. package/lib/migrations/migrate/stub/knexfile-eg.stub +43 -43
  123. package/lib/migrations/migrate/stub/knexfile-js.stub +47 -47
  124. package/lib/migrations/migrate/stub/knexfile-ls.stub +35 -35
  125. package/lib/migrations/migrate/stub/knexfile-ts.stub +47 -47
  126. package/lib/migrations/migrate/stub/ls.stub +14 -14
  127. package/lib/migrations/migrate/stub/mjs.stub +23 -23
  128. package/lib/migrations/migrate/stub/ts-schema.stub +21 -21
  129. package/lib/migrations/migrate/stub/ts.stub +21 -21
  130. package/lib/migrations/migrate/table-creator.js +77 -77
  131. package/lib/migrations/migrate/table-resolver.js +27 -27
  132. package/lib/migrations/seed/Seeder.js +137 -137
  133. package/lib/migrations/seed/seed-stub.js +13 -13
  134. package/lib/migrations/seed/seeder-configuration-merger.js +60 -60
  135. package/lib/migrations/seed/sources/fs-seeds.js +65 -65
  136. package/lib/migrations/seed/stub/coffee.stub +9 -9
  137. package/lib/migrations/seed/stub/eg.stub +11 -11
  138. package/lib/migrations/seed/stub/js.stub +13 -13
  139. package/lib/migrations/seed/stub/ls.stub +11 -11
  140. package/lib/migrations/seed/stub/mjs.stub +12 -12
  141. package/lib/migrations/seed/stub/ts.stub +13 -13
  142. package/lib/migrations/util/fs.js +86 -86
  143. package/lib/migrations/util/import-file.js +12 -12
  144. package/lib/migrations/util/is-module-type.js +9 -9
  145. package/lib/migrations/util/template.js +52 -52
  146. package/lib/migrations/util/timestamp.js +14 -14
  147. package/lib/query/analytic.js +52 -52
  148. package/lib/query/constants.js +15 -15
  149. package/lib/query/joinclause.js +270 -270
  150. package/lib/query/method-constants.js +136 -135
  151. package/lib/query/querybuilder.js +1793 -1794
  152. package/lib/query/querycompiler.js +1591 -1580
  153. package/lib/raw.js +139 -139
  154. package/lib/ref.js +39 -39
  155. package/lib/schema/builder.js +115 -115
  156. package/lib/schema/columnbuilder.js +146 -146
  157. package/lib/schema/columncompiler.js +307 -307
  158. package/lib/schema/compiler.js +187 -187
  159. package/lib/schema/internal/helpers.js +55 -55
  160. package/lib/schema/tablebuilder.js +376 -376
  161. package/lib/schema/tablecompiler.js +433 -433
  162. package/lib/schema/viewbuilder.js +92 -92
  163. package/lib/schema/viewcompiler.js +138 -138
  164. package/lib/util/finally-mixin.js +13 -13
  165. package/lib/util/helpers.js +95 -95
  166. package/lib/util/is.js +32 -32
  167. package/lib/util/nanoid.js +40 -40
  168. package/lib/util/noop.js +1 -1
  169. package/lib/util/save-async-stack.js +14 -14
  170. package/lib/util/security.js +26 -0
  171. package/lib/util/string.js +190 -190
  172. package/lib/util/timeout.js +29 -29
  173. package/package.json +12 -10
  174. package/scripts/build.js +125 -125
  175. package/scripts/clean.js +31 -31
  176. package/scripts/docker-compose.yml +152 -152
  177. package/scripts/next-release-howto.md +24 -24
  178. package/scripts/oracledb-install-driver-libs.sh +82 -82
  179. package/scripts/release.sh +34 -34
  180. package/scripts/runkit-example.js +34 -34
  181. package/scripts/stress-test/README.txt +18 -18
  182. package/scripts/stress-test/docker-compose.yml +57 -57
  183. package/scripts/stress-test/knex-stress-test.js +208 -208
  184. package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +145 -145
  185. package/scripts/stress-test/mysql2-sudden-exit-without-error.js +100 -100
  186. package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +184 -184
  187. package/scripts/update_gitignore_for_tsc_output.js +90 -90
  188. package/types/index.d.ts +3273 -3233
  189. package/types/result.d.ts +27 -27
  190. package/types/tables.d.ts +4 -4
package/README.md CHANGED
@@ -1,148 +1,147 @@
1
- # [knex.js](https://knex.github.io/documentation/)
2
-
3
- [![npm version](http://img.shields.io/npm/v/knex.svg)](https://npmjs.org/package/knex)
4
- [![npm downloads](https://img.shields.io/npm/dm/knex.svg)](https://npmjs.org/package/knex)
5
- ![](https://github.com/knex/knex/workflows/CI/badge.svg)
6
- [![Coverage Status](https://coveralls.io/repos/knex/knex/badge.svg?branch=master)](https://coveralls.io/r/knex/knex?branch=master)
7
- [![Dependencies Status](https://img.shields.io/librariesio/github/knex/knex)](https://libraries.io/npm/knex)
8
- [![Gitter chat](https://badges.gitter.im/tgriesser/knex.svg)](https://gitter.im/tgriesser/knex)
9
- [![Language Grade: JavaScript](https://img.shields.io/lgtm/grade/javascript/g/knex/knex.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/knex/knex/context:javascript)
10
-
11
- > **A SQL query builder that is _flexible_, _portable_, and _fun_ to use!**
12
-
13
- A batteries-included, multi-dialect (PostgreSQL, MySQL, CockroachDB, MSSQL, SQLite3, Oracle (including Oracle Wallet Authentication)) query builder for
14
- Node.js, featuring:
15
-
16
- - [transactions](https://knex.github.io/documentation/#Transactions)
17
- - [connection pooling](https://knex.github.io/documentation/#Installation-pooling)
18
- - [streaming queries](https://knex.github.io/documentation/#Interfaces-Streams)
19
- - both a [promise](https://knex.github.io/documentation/#Interfaces-Promises) and [callback](https://knex.github.io/documentation/#Interfaces-Callbacks) API
20
- - a [thorough test suite](https://github.com/knex/knex/actions)
21
-
22
- Node.js versions 12+ are supported.
23
-
24
- * Take a look at the [full documentation](https://knex.github.io/documentation) to get started!
25
- * Browse the [list of plugins and tools](https://github.com/knex/knex/blob/master/ECOSYSTEM.md) built for knex
26
- * Check out our [recipes wiki](https://github.com/knex/knex/wiki/Recipes) to search for solutions to some specific problems
27
- * In case of upgrading from an older version, see [migration guide](https://github.com/knex/knex/blob/master/UPGRADING.md)
28
-
29
- You can report bugs and discuss features on the [GitHub issues page](https://github.com/knex/knex/issues) or send tweets to [@kibertoad](http://twitter.com/kibertoad).
30
-
31
-
32
- For support and questions, join our [Gitter channel](https://gitter.im/tgriesser/knex).
33
-
34
- For knex-based Object Relational Mapper, see:
35
-
36
- - https://github.com/Vincit/objection.js
37
- - https://github.com/mikro-orm/mikro-orm
38
- - https://bookshelfjs.org
39
-
40
- To see the SQL that Knex will generate for a given query, you can use [Knex Query Lab](https://michaelavila.com/knex-querylab/)
41
-
42
- ## Examples
43
-
44
- We have several examples [on the website](http://knexjs.org). Here is the first one to get you started:
45
-
46
- ```js
47
- const knex = require('knex')({
48
- client: 'sqlite3',
49
- connection: {
50
- filename: './data.db',
51
- },
52
- });
53
-
54
- try {
55
-
56
- // Create a table
57
- await knex.schema
58
- .createTable('users', table => {
59
- table.increments('id');
60
- table.string('user_name');
61
- })
62
- // ...and another
63
- .createTable('accounts', table => {
64
- table.increments('id');
65
- table.string('account_name');
66
- table
67
- .integer('user_id')
68
- .unsigned()
69
- .references('users.id');
70
- })
71
-
72
- // Then query the table...
73
- const insertedRows = await knex('users').insert({ user_name: 'Tim' })
74
-
75
- // ...and using the insert id, insert into the other table.
76
- await knex('accounts').insert({ account_name: 'knex', user_id: insertedRows[0] })
77
-
78
- // Query both of the rows.
79
- const selectedRows = await knex('users')
80
- .join('accounts', 'users.id', 'accounts.user_id')
81
- .select('users.user_name as user', 'accounts.account_name as account')
82
-
83
- // map over the results
84
- const enrichedRows = selectedRows.map(row => ({ ...row, active: true }))
85
-
86
- // Finally, add a catch statement
87
- } catch(e) {
88
- console.error(e);
89
- };
90
- ```
91
-
92
- ## TypeScript example
93
- ```ts
94
- import { Knex, knex } from 'knex'
95
-
96
- interface User {
97
- id: number;
98
- age: number;
99
- name: string;
100
- active: boolean;
101
- departmentId: number;
102
- }
103
-
104
- const config: Knex.Config = {
105
- client: 'sqlite3',
106
- connection: {
107
- filename: './data.db',
108
- },
109
- };
110
-
111
- const knexInstance = knex(config);
112
-
113
- try {
114
- const users = await knex<User>('users').select('id', 'age');
115
- } catch (err) {
116
- // error handling
117
- }
118
- ```
119
-
120
- ## Usage as ESM module
121
-
122
- If you are launching your Node application with `--experimental-modules`, `knex.mjs` should be picked up automatically and named ESM import should work out-of-the-box.
123
- Otherwise, if you want to use named imports, you'll have to import knex like this:
124
- ```js
125
- import { knex } from 'knex/knex.mjs'
126
- ```
127
-
128
- You can also just do the default import:
129
- ```js
130
- import knex from 'knex'
131
- ```
132
-
133
- If you are not using TypeScript and would like the IntelliSense of your IDE to work correctly, it is recommended to set the type explicitly:
134
- ```js
135
- /**
136
- * @type {Knex}
137
- */
138
- const database = knex({
139
- client: 'mysql',
140
- connection: {
141
- host : '127.0.0.1',
142
- user : 'your_database_user',
143
- password : 'your_database_password',
144
- database : 'myapp_test'
145
- }
146
- });
147
- database.migrate.latest();
148
- ```
1
+ # [knex.js](https://knex.github.io/documentation/)
2
+
3
+ [![npm version](http://img.shields.io/npm/v/knex.svg)](https://npmjs.org/package/knex)
4
+ [![npm downloads](https://img.shields.io/npm/dm/knex.svg)](https://npmjs.org/package/knex)
5
+ ![](https://github.com/knex/knex/workflows/CI/badge.svg)
6
+ [![Coverage Status](https://coveralls.io/repos/knex/knex/badge.svg?branch=master)](https://coveralls.io/r/knex/knex?branch=master)
7
+ [![Dependencies Status](https://img.shields.io/librariesio/github/knex/knex)](https://libraries.io/npm/knex)
8
+ [![Gitter chat](https://badges.gitter.im/tgriesser/knex.svg)](https://gitter.im/tgriesser/knex)
9
+
10
+ > **A SQL query builder that is _flexible_, _portable_, and _fun_ to use!**
11
+
12
+ A batteries-included, multi-dialect (PostgreSQL, MySQL, CockroachDB, MSSQL, SQLite3, Oracle (including Oracle Wallet Authentication)) query builder for
13
+ Node.js, featuring:
14
+
15
+ - [transactions](https://knex.github.io/documentation/#Transactions)
16
+ - [connection pooling](https://knex.github.io/documentation/#Installation-pooling)
17
+ - [streaming queries](https://knex.github.io/documentation/#Interfaces-Streams)
18
+ - both a [promise](https://knex.github.io/documentation/#Interfaces-Promises) and [callback](https://knex.github.io/documentation/#Interfaces-Callbacks) API
19
+ - a [thorough test suite](https://github.com/knex/knex/actions)
20
+
21
+ Node.js versions 12+ are supported.
22
+
23
+ * Take a look at the [full documentation](https://knex.github.io/documentation) to get started!
24
+ * Browse the [list of plugins and tools](https://github.com/knex/knex/blob/master/ECOSYSTEM.md) built for knex
25
+ * Check out our [recipes wiki](https://github.com/knex/knex/wiki/Recipes) to search for solutions to some specific problems
26
+ * In case of upgrading from an older version, see [migration guide](https://github.com/knex/knex/blob/master/UPGRADING.md)
27
+
28
+ You can report bugs and discuss features on the [GitHub issues page](https://github.com/knex/knex/issues) or send tweets to [@kibertoad](http://twitter.com/kibertoad).
29
+
30
+
31
+ For support and questions, join our [Gitter channel](https://gitter.im/tgriesser/knex).
32
+
33
+ For knex-based Object Relational Mapper, see:
34
+
35
+ - https://github.com/Vincit/objection.js
36
+ - https://github.com/mikro-orm/mikro-orm
37
+ - https://bookshelfjs.org
38
+
39
+ To see the SQL that Knex will generate for a given query, you can use [Knex Query Lab](https://michaelavila.com/knex-querylab/)
40
+
41
+ ## Examples
42
+
43
+ We have several examples [on the website](http://knexjs.org). Here is the first one to get you started:
44
+
45
+ ```js
46
+ const knex = require('knex')({
47
+ client: 'sqlite3',
48
+ connection: {
49
+ filename: './data.db',
50
+ },
51
+ });
52
+
53
+ try {
54
+
55
+ // Create a table
56
+ await knex.schema
57
+ .createTable('users', table => {
58
+ table.increments('id');
59
+ table.string('user_name');
60
+ })
61
+ // ...and another
62
+ .createTable('accounts', table => {
63
+ table.increments('id');
64
+ table.string('account_name');
65
+ table
66
+ .integer('user_id')
67
+ .unsigned()
68
+ .references('users.id');
69
+ })
70
+
71
+ // Then query the table...
72
+ const insertedRows = await knex('users').insert({ user_name: 'Tim' })
73
+
74
+ // ...and using the insert id, insert into the other table.
75
+ await knex('accounts').insert({ account_name: 'knex', user_id: insertedRows[0] })
76
+
77
+ // Query both of the rows.
78
+ const selectedRows = await knex('users')
79
+ .join('accounts', 'users.id', 'accounts.user_id')
80
+ .select('users.user_name as user', 'accounts.account_name as account')
81
+
82
+ // map over the results
83
+ const enrichedRows = selectedRows.map(row => ({ ...row, active: true }))
84
+
85
+ // Finally, add a catch statement
86
+ } catch(e) {
87
+ console.error(e);
88
+ };
89
+ ```
90
+
91
+ ## TypeScript example
92
+ ```ts
93
+ import { Knex, knex } from 'knex'
94
+
95
+ interface User {
96
+ id: number;
97
+ age: number;
98
+ name: string;
99
+ active: boolean;
100
+ departmentId: number;
101
+ }
102
+
103
+ const config: Knex.Config = {
104
+ client: 'sqlite3',
105
+ connection: {
106
+ filename: './data.db',
107
+ },
108
+ };
109
+
110
+ const knexInstance = knex(config);
111
+
112
+ try {
113
+ const users = await knex<User>('users').select('id', 'age');
114
+ } catch (err) {
115
+ // error handling
116
+ }
117
+ ```
118
+
119
+ ## Usage as ESM module
120
+
121
+ If you are launching your Node application with `--experimental-modules`, `knex.mjs` should be picked up automatically and named ESM import should work out-of-the-box.
122
+ Otherwise, if you want to use named imports, you'll have to import knex like this:
123
+ ```js
124
+ import { knex } from 'knex/knex.mjs'
125
+ ```
126
+
127
+ You can also just do the default import:
128
+ ```js
129
+ import knex from 'knex'
130
+ ```
131
+
132
+ If you are not using TypeScript and would like the IntelliSense of your IDE to work correctly, it is recommended to set the type explicitly:
133
+ ```js
134
+ /**
135
+ * @type {Knex}
136
+ */
137
+ const database = knex({
138
+ client: 'mysql',
139
+ connection: {
140
+ host : '127.0.0.1',
141
+ user : 'your_database_user',
142
+ password : 'your_database_password',
143
+ database : 'myapp_test'
144
+ }
145
+ });
146
+ database.migrate.latest();
147
+ ```