knex 3.0.1 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2431 -2358
- package/CONTRIBUTING.md +190 -194
- package/LICENSE +22 -22
- package/README.md +156 -149
- package/UPGRADING.md +245 -245
- package/bin/cli.js +516 -475
- package/bin/knexfile-runtime-error.js +27 -0
- package/bin/utils/cli-config-utils.js +217 -212
- package/bin/utils/constants.js +7 -7
- package/bin/utils/migrationsLister.js +37 -37
- package/knex.js +23 -23
- package/knex.mjs +11 -11
- package/lib/builder-interface-augmenter.js +120 -120
- package/lib/client.js +585 -495
- package/lib/constants.js +61 -61
- package/lib/dialects/better-sqlite3/index.js +101 -77
- package/lib/dialects/cockroachdb/crdb-columncompiler.js +14 -14
- package/lib/dialects/cockroachdb/crdb-querybuilder.js +11 -11
- package/lib/dialects/cockroachdb/crdb-querycompiler.js +122 -122
- package/lib/dialects/cockroachdb/crdb-tablecompiler.js +46 -37
- package/lib/dialects/cockroachdb/crdb-viewcompiler.js +15 -15
- package/lib/dialects/cockroachdb/index.js +86 -86
- package/lib/dialects/index.js +34 -34
- package/lib/dialects/mssql/index.js +498 -500
- package/lib/dialects/mssql/mssql-formatter.js +34 -34
- package/lib/dialects/mssql/query/mssql-querycompiler.js +601 -601
- package/lib/dialects/mssql/schema/mssql-columncompiler.js +185 -185
- package/lib/dialects/mssql/schema/mssql-compiler.js +91 -91
- package/lib/dialects/mssql/schema/mssql-tablecompiler.js +393 -378
- package/lib/dialects/mssql/schema/mssql-viewcompiler.js +55 -55
- package/lib/dialects/mssql/transaction.js +176 -176
- package/lib/dialects/mysql/index.js +317 -201
- package/lib/dialects/mysql/query/mysql-querybuilder.js +14 -0
- package/lib/dialects/mysql/query/mysql-querycompiler.js +292 -274
- package/lib/dialects/mysql/schema/mysql-columncompiler.js +193 -193
- package/lib/dialects/mysql/schema/mysql-compiler.js +60 -60
- package/lib/dialects/mysql/schema/mysql-tablecompiler.js +426 -381
- package/lib/dialects/mysql/schema/mysql-viewbuilder.js +21 -21
- package/lib/dialects/mysql/schema/mysql-viewcompiler.js +15 -15
- package/lib/dialects/mysql/transaction.js +46 -46
- package/lib/dialects/mysql2/index.js +53 -53
- package/lib/dialects/mysql2/transaction.js +44 -44
- package/lib/dialects/oracle/DEAD_CODE.md +5 -5
- package/lib/dialects/oracle/index.js +92 -92
- package/lib/dialects/oracle/query/oracle-querycompiler.js +343 -343
- package/lib/dialects/oracle/schema/internal/incrementUtils.js +22 -20
- package/lib/dialects/oracle/schema/internal/trigger.js +155 -135
- package/lib/dialects/oracle/schema/oracle-columnbuilder.js +17 -17
- package/lib/dialects/oracle/schema/oracle-columncompiler.js +126 -126
- package/lib/dialects/oracle/schema/oracle-compiler.js +124 -122
- package/lib/dialects/oracle/schema/oracle-tablecompiler.js +210 -190
- package/lib/dialects/oracle/utils.js +107 -87
- package/lib/dialects/oracledb/index.js +381 -327
- package/lib/dialects/oracledb/query/oracledb-querycompiler.js +481 -481
- package/lib/dialects/oracledb/schema/oracledb-columncompiler.js +61 -61
- package/lib/dialects/oracledb/schema/oracledb-tablecompiler.js +19 -19
- package/lib/dialects/oracledb/schema/oracledb-viewbuilder.js +13 -13
- package/lib/dialects/oracledb/schema/oracledb-viewcompiler.js +19 -19
- package/lib/dialects/oracledb/transaction.js +98 -98
- package/lib/dialects/oracledb/utils.js +208 -208
- package/lib/dialects/pgnative/index.js +60 -60
- package/lib/dialects/postgres/execution/pg-transaction.js +19 -19
- package/lib/dialects/postgres/index.js +373 -358
- package/lib/dialects/postgres/query/pg-querybuilder.js +43 -43
- package/lib/dialects/postgres/query/pg-querycompiler.js +400 -400
- package/lib/dialects/postgres/schema/pg-columncompiler.js +162 -156
- package/lib/dialects/postgres/schema/pg-compiler.js +138 -138
- package/lib/dialects/postgres/schema/pg-tablecompiler.js +331 -304
- package/lib/dialects/postgres/schema/pg-viewbuilder.js +21 -21
- package/lib/dialects/postgres/schema/pg-viewcompiler.js +35 -35
- package/lib/dialects/redshift/index.js +86 -86
- package/lib/dialects/redshift/query/redshift-querycompiler.js +163 -163
- package/lib/dialects/redshift/schema/redshift-columnbuilder.js +22 -22
- package/lib/dialects/redshift/schema/redshift-columncompiler.js +67 -67
- package/lib/dialects/redshift/schema/redshift-compiler.js +14 -14
- package/lib/dialects/redshift/schema/redshift-tablecompiler.js +134 -122
- package/lib/dialects/redshift/schema/redshift-viewcompiler.js +11 -11
- package/lib/dialects/redshift/transaction.js +32 -32
- package/lib/dialects/sqlite3/execution/sqlite-transaction.js +172 -25
- package/lib/dialects/sqlite3/index.js +263 -250
- package/lib/dialects/sqlite3/query/sqlite-querybuilder.js +33 -33
- package/lib/dialects/sqlite3/query/sqlite-querycompiler.js +341 -334
- package/lib/dialects/sqlite3/schema/ddl.js +380 -400
- package/lib/dialects/sqlite3/schema/internal/compiler.js +327 -327
- package/lib/dialects/sqlite3/schema/internal/parser-combinator.js +161 -161
- package/lib/dialects/sqlite3/schema/internal/parser.js +638 -638
- package/lib/dialects/sqlite3/schema/internal/sqlite-ddl-operations.js +41 -41
- package/lib/dialects/sqlite3/schema/internal/tokenizer.js +38 -38
- package/lib/dialects/sqlite3/schema/internal/utils.js +12 -12
- package/lib/dialects/sqlite3/schema/sqlite-columncompiler.js +50 -50
- package/lib/dialects/sqlite3/schema/sqlite-compiler.js +80 -80
- package/lib/dialects/sqlite3/schema/sqlite-tablecompiler.js +364 -347
- package/lib/dialects/sqlite3/schema/sqlite-viewcompiler.js +40 -40
- package/lib/execution/batch-insert.js +51 -51
- package/lib/execution/internal/delay.js +6 -6
- package/lib/execution/internal/ensure-connection-callback.js +41 -41
- package/lib/execution/internal/query-executioner.js +62 -62
- package/lib/execution/runner.js +325 -325
- package/lib/execution/transaction.js +417 -409
- package/lib/formatter/formatterUtils.js +42 -42
- package/lib/formatter/rawFormatter.js +84 -84
- package/lib/formatter/wrappingFormatter.js +253 -250
- package/lib/formatter.js +25 -25
- package/lib/index.js +3 -3
- package/lib/knex-builder/FunctionHelper.js +80 -80
- package/lib/knex-builder/Knex.js +59 -59
- package/lib/knex-builder/internal/config-resolver.js +57 -57
- package/lib/knex-builder/internal/parse-connection.js +87 -87
- package/lib/knex-builder/make-knex.js +345 -345
- package/lib/logger.js +76 -76
- package/lib/migrations/common/MigrationsLoader.js +36 -36
- package/lib/migrations/migrate/MigrationGenerator.js +84 -84
- package/lib/migrations/migrate/Migrator.js +632 -599
- package/lib/migrations/migrate/migrate-stub.js +17 -17
- package/lib/migrations/migrate/migration-list-resolver.js +33 -33
- package/lib/migrations/migrate/migrator-configuration-merger.js +58 -58
- package/lib/migrations/migrate/sources/fs-migrations.js +74 -74
- package/lib/migrations/migrate/stub/cjs.stub +15 -15
- package/lib/migrations/migrate/stub/coffee.stub +13 -13
- package/lib/migrations/migrate/stub/eg.stub +14 -14
- package/lib/migrations/migrate/stub/js-schema.stub +22 -22
- package/lib/migrations/migrate/stub/js.stub +22 -22
- package/lib/migrations/migrate/stub/knexfile-coffee.stub +34 -34
- package/lib/migrations/migrate/stub/knexfile-eg.stub +43 -43
- package/lib/migrations/migrate/stub/knexfile-js.stub +47 -47
- package/lib/migrations/migrate/stub/knexfile-ls.stub +35 -35
- package/lib/migrations/migrate/stub/knexfile-ts.stub +47 -47
- package/lib/migrations/migrate/stub/ls.stub +14 -14
- package/lib/migrations/migrate/stub/mjs.stub +23 -23
- package/lib/migrations/migrate/stub/ts-schema.stub +21 -21
- package/lib/migrations/migrate/stub/ts.stub +21 -21
- package/lib/migrations/migrate/table-creator.js +77 -77
- package/lib/migrations/migrate/table-resolver.js +27 -27
- package/lib/migrations/seed/Seeder.js +137 -137
- package/lib/migrations/seed/seed-stub.js +13 -13
- package/lib/migrations/seed/seeder-configuration-merger.js +60 -60
- package/lib/migrations/seed/sources/fs-seeds.js +65 -65
- package/lib/migrations/seed/stub/coffee.stub +9 -9
- package/lib/migrations/seed/stub/eg.stub +11 -11
- package/lib/migrations/seed/stub/js.stub +13 -13
- package/lib/migrations/seed/stub/ls.stub +11 -11
- package/lib/migrations/seed/stub/mjs.stub +12 -12
- package/lib/migrations/seed/stub/ts.stub +13 -13
- package/lib/migrations/util/fs.js +86 -86
- package/lib/migrations/util/import-file.js +12 -12
- package/lib/migrations/util/is-module-type.js +9 -9
- package/lib/migrations/util/template.js +52 -52
- package/lib/migrations/util/timestamp.js +14 -14
- package/lib/query/analytic.js +52 -52
- package/lib/query/constants.js +15 -15
- package/lib/query/joinclause.js +270 -270
- package/lib/query/method-constants.js +136 -136
- package/lib/query/querybuilder.js +1793 -1793
- package/lib/query/querycompiler.js +1634 -1591
- package/lib/raw.js +139 -139
- package/lib/ref.js +39 -39
- package/lib/schema/builder.js +115 -115
- package/lib/schema/columnbuilder.js +146 -146
- package/lib/schema/columncompiler.js +307 -307
- package/lib/schema/compiler.js +187 -187
- package/lib/schema/internal/helpers.js +55 -55
- package/lib/schema/tablebuilder.js +379 -376
- package/lib/schema/tablecompiler.js +450 -433
- package/lib/schema/viewbuilder.js +92 -92
- package/lib/schema/viewcompiler.js +138 -138
- package/lib/util/finally-mixin.js +13 -13
- package/lib/util/helpers.js +95 -95
- package/lib/util/is.js +32 -32
- package/lib/util/nanoid.js +40 -40
- package/lib/util/noop.js +1 -1
- package/lib/util/save-async-stack.js +14 -14
- package/lib/util/security.js +32 -26
- package/lib/util/string.js +190 -190
- package/lib/util/timeout.js +29 -29
- package/package.json +285 -266
- package/scripts/act-testing/act.sh +19 -0
- package/scripts/act-testing/merged-no-label.json +11 -0
- package/scripts/act-testing/merged-patch-labeled.json +12 -0
- package/scripts/act-testing/merged-skip-labeled.json +12 -0
- package/scripts/act-testing/not-merged-patch-labeled.json +12 -0
- package/scripts/build-for-release.sh +122 -0
- package/scripts/build.js +125 -125
- package/scripts/clean.js +31 -31
- package/scripts/docker-compose.yml +150 -152
- package/scripts/format-changelog.js +55 -0
- package/scripts/next-release-howto.md +24 -24
- package/scripts/oracledb-install-driver-libs.sh +82 -82
- package/scripts/release.sh +36 -36
- package/scripts/runkit-example.js +35 -35
- package/scripts/stress-test/README.txt +18 -18
- package/scripts/stress-test/docker-compose.yml +55 -57
- package/scripts/stress-test/knex-stress-test.js +212 -212
- package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +149 -149
- package/scripts/stress-test/mysql2-sudden-exit-without-error.js +101 -101
- package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +188 -188
- package/types/index.d.ts +3321 -3272
- package/types/result.d.ts +27 -27
- package/types/tables.d.ts +4 -4
- package/scripts/update_gitignore_for_tsc_output.js +0 -90
|
@@ -1,193 +1,193 @@
|
|
|
1
|
-
// MySQL Column Compiler
|
|
2
|
-
// -------
|
|
3
|
-
const ColumnCompiler = require('../../../schema/columncompiler');
|
|
4
|
-
const { isObject } = require('../../../util/is');
|
|
5
|
-
const { toNumber } = require('../../../util/helpers');
|
|
6
|
-
|
|
7
|
-
const commentEscapeRegex = /(?<!\\)'/g;
|
|
8
|
-
|
|
9
|
-
class ColumnCompiler_MySQL extends ColumnCompiler {
|
|
10
|
-
constructor(client, tableCompiler, columnBuilder) {
|
|
11
|
-
super(client, tableCompiler, columnBuilder);
|
|
12
|
-
this.modifiers = [
|
|
13
|
-
'unsigned',
|
|
14
|
-
'nullable',
|
|
15
|
-
'defaultTo',
|
|
16
|
-
'comment',
|
|
17
|
-
'collate',
|
|
18
|
-
'first',
|
|
19
|
-
'after',
|
|
20
|
-
];
|
|
21
|
-
this._addCheckModifiers();
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// Types
|
|
25
|
-
// ------
|
|
26
|
-
|
|
27
|
-
double(precision, scale) {
|
|
28
|
-
if (!precision) return 'double';
|
|
29
|
-
return `double(${toNumber(precision, 8)}, ${toNumber(scale, 2)})`;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
integer(length) {
|
|
33
|
-
length = length ? `(${toNumber(length, 11)})` : '';
|
|
34
|
-
return `int${length}`;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
tinyint(length) {
|
|
38
|
-
length = length ? `(${toNumber(length, 1)})` : '';
|
|
39
|
-
return `tinyint${length}`;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
text(column) {
|
|
43
|
-
switch (column) {
|
|
44
|
-
case 'medium':
|
|
45
|
-
case 'mediumtext':
|
|
46
|
-
return 'mediumtext';
|
|
47
|
-
case 'long':
|
|
48
|
-
case 'longtext':
|
|
49
|
-
return 'longtext';
|
|
50
|
-
default:
|
|
51
|
-
return 'text';
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
mediumtext() {
|
|
56
|
-
return this.text('medium');
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
longtext() {
|
|
60
|
-
return this.text('long');
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
enu(allowed) {
|
|
64
|
-
return `enum('${allowed.join("', '")}')`;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
datetime(precision) {
|
|
68
|
-
if (isObject(precision)) {
|
|
69
|
-
({ precision } = precision);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return typeof precision === 'number'
|
|
73
|
-
? `datetime(${precision})`
|
|
74
|
-
: 'datetime';
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
timestamp(precision) {
|
|
78
|
-
if (isObject(precision)) {
|
|
79
|
-
({ precision } = precision);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return typeof precision === 'number'
|
|
83
|
-
? `timestamp(${precision})`
|
|
84
|
-
: 'timestamp';
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
time(precision) {
|
|
88
|
-
if (isObject(precision)) {
|
|
89
|
-
({ precision } = precision);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return typeof precision === 'number' ? `time(${precision})` : 'time';
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
bit(length) {
|
|
96
|
-
return length ? `bit(${toNumber(length)})` : 'bit';
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
binary(length) {
|
|
100
|
-
return length ? `varbinary(${toNumber(length)})` : 'blob';
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
json() {
|
|
104
|
-
return 'json';
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
jsonb() {
|
|
108
|
-
return 'json';
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Modifiers
|
|
112
|
-
// ------
|
|
113
|
-
|
|
114
|
-
defaultTo(value) {
|
|
115
|
-
// MySQL defaults to null by default, but breaks down if you pass it explicitly
|
|
116
|
-
// Note that in MySQL versions up to 5.7, logic related to updating
|
|
117
|
-
// timestamps when no explicit value is passed is quite insane - https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_explicit_defaults_for_timestamp
|
|
118
|
-
if (value === null || value === undefined) {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
if ((this.type === 'json' || this.type === 'jsonb') && isObject(value)) {
|
|
122
|
-
// Default value for json will work only it is an expression
|
|
123
|
-
return `default ('${JSON.stringify(value)}')`;
|
|
124
|
-
}
|
|
125
|
-
const defaultVal = super.defaultTo.apply(this, arguments);
|
|
126
|
-
if (this.type !== 'blob' && this.type.indexOf('text') === -1) {
|
|
127
|
-
return defaultVal;
|
|
128
|
-
}
|
|
129
|
-
return '';
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
unsigned() {
|
|
133
|
-
return 'unsigned';
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
comment(comment) {
|
|
137
|
-
if (comment && comment.length > 255) {
|
|
138
|
-
this.client.logger.warn(
|
|
139
|
-
'Your comment is longer than the max comment length for MySQL'
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
return comment && `comment '${comment.replace(commentEscapeRegex, "\\'")}'`;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
first() {
|
|
146
|
-
return 'first';
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
after(column) {
|
|
150
|
-
return `after ${this.formatter.wrap(column)}`;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
collate(collation) {
|
|
154
|
-
return collation && `collate '${collation}'`;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
checkRegex(regex, constraintName) {
|
|
158
|
-
return this._check(
|
|
159
|
-
`${this.formatter.wrap(
|
|
160
|
-
this.getColumnName()
|
|
161
|
-
)} REGEXP ${this.client._escapeBinding(regex)}`,
|
|
162
|
-
constraintName
|
|
163
|
-
);
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
increments(options = { primaryKey: true }) {
|
|
167
|
-
return (
|
|
168
|
-
'int unsigned not null' +
|
|
169
|
-
// In MySQL autoincrement are always a primary key. If you already have a primary key, we
|
|
170
|
-
// initialize this column as classic int column then modify it later in table compiler
|
|
171
|
-
(this.tableCompiler._canBeAddPrimaryKey(options)
|
|
172
|
-
? ' auto_increment primary key'
|
|
173
|
-
: '')
|
|
174
|
-
);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
bigincrements(options = { primaryKey: true }) {
|
|
178
|
-
return (
|
|
179
|
-
'bigint unsigned not null' +
|
|
180
|
-
// In MySQL autoincrement are always a primary key. If you already have a primary key, we
|
|
181
|
-
// initialize this column as classic int column then modify it later in table compiler
|
|
182
|
-
(this.tableCompiler._canBeAddPrimaryKey(options)
|
|
183
|
-
? ' auto_increment primary key'
|
|
184
|
-
: '')
|
|
185
|
-
);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
ColumnCompiler_MySQL.prototype.bigint = 'bigint';
|
|
190
|
-
ColumnCompiler_MySQL.prototype.mediumint = 'mediumint';
|
|
191
|
-
ColumnCompiler_MySQL.prototype.smallint = 'smallint';
|
|
192
|
-
|
|
193
|
-
module.exports = ColumnCompiler_MySQL;
|
|
1
|
+
// MySQL Column Compiler
|
|
2
|
+
// -------
|
|
3
|
+
const ColumnCompiler = require('../../../schema/columncompiler');
|
|
4
|
+
const { isObject } = require('../../../util/is');
|
|
5
|
+
const { toNumber } = require('../../../util/helpers');
|
|
6
|
+
|
|
7
|
+
const commentEscapeRegex = /(?<!\\)'/g;
|
|
8
|
+
|
|
9
|
+
class ColumnCompiler_MySQL extends ColumnCompiler {
|
|
10
|
+
constructor(client, tableCompiler, columnBuilder) {
|
|
11
|
+
super(client, tableCompiler, columnBuilder);
|
|
12
|
+
this.modifiers = [
|
|
13
|
+
'unsigned',
|
|
14
|
+
'nullable',
|
|
15
|
+
'defaultTo',
|
|
16
|
+
'comment',
|
|
17
|
+
'collate',
|
|
18
|
+
'first',
|
|
19
|
+
'after',
|
|
20
|
+
];
|
|
21
|
+
this._addCheckModifiers();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Types
|
|
25
|
+
// ------
|
|
26
|
+
|
|
27
|
+
double(precision, scale) {
|
|
28
|
+
if (!precision) return 'double';
|
|
29
|
+
return `double(${toNumber(precision, 8)}, ${toNumber(scale, 2)})`;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
integer(length) {
|
|
33
|
+
length = length ? `(${toNumber(length, 11)})` : '';
|
|
34
|
+
return `int${length}`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
tinyint(length) {
|
|
38
|
+
length = length ? `(${toNumber(length, 1)})` : '';
|
|
39
|
+
return `tinyint${length}`;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
text(column) {
|
|
43
|
+
switch (column) {
|
|
44
|
+
case 'medium':
|
|
45
|
+
case 'mediumtext':
|
|
46
|
+
return 'mediumtext';
|
|
47
|
+
case 'long':
|
|
48
|
+
case 'longtext':
|
|
49
|
+
return 'longtext';
|
|
50
|
+
default:
|
|
51
|
+
return 'text';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
mediumtext() {
|
|
56
|
+
return this.text('medium');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
longtext() {
|
|
60
|
+
return this.text('long');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
enu(allowed) {
|
|
64
|
+
return `enum('${allowed.join("', '")}')`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
datetime(precision) {
|
|
68
|
+
if (isObject(precision)) {
|
|
69
|
+
({ precision } = precision);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return typeof precision === 'number'
|
|
73
|
+
? `datetime(${precision})`
|
|
74
|
+
: 'datetime';
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
timestamp(precision) {
|
|
78
|
+
if (isObject(precision)) {
|
|
79
|
+
({ precision } = precision);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return typeof precision === 'number'
|
|
83
|
+
? `timestamp(${precision})`
|
|
84
|
+
: 'timestamp';
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
time(precision) {
|
|
88
|
+
if (isObject(precision)) {
|
|
89
|
+
({ precision } = precision);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return typeof precision === 'number' ? `time(${precision})` : 'time';
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
bit(length) {
|
|
96
|
+
return length ? `bit(${toNumber(length)})` : 'bit';
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
binary(length) {
|
|
100
|
+
return length ? `varbinary(${toNumber(length)})` : 'blob';
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
json() {
|
|
104
|
+
return 'json';
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
jsonb() {
|
|
108
|
+
return 'json';
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Modifiers
|
|
112
|
+
// ------
|
|
113
|
+
|
|
114
|
+
defaultTo(value) {
|
|
115
|
+
// MySQL defaults to null by default, but breaks down if you pass it explicitly
|
|
116
|
+
// Note that in MySQL versions up to 5.7, logic related to updating
|
|
117
|
+
// timestamps when no explicit value is passed is quite insane - https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_explicit_defaults_for_timestamp
|
|
118
|
+
if (value === null || value === undefined) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if ((this.type === 'json' || this.type === 'jsonb') && isObject(value)) {
|
|
122
|
+
// Default value for json will work only it is an expression
|
|
123
|
+
return `default ('${JSON.stringify(value)}')`;
|
|
124
|
+
}
|
|
125
|
+
const defaultVal = super.defaultTo.apply(this, arguments);
|
|
126
|
+
if (this.type !== 'blob' && this.type.indexOf('text') === -1) {
|
|
127
|
+
return defaultVal;
|
|
128
|
+
}
|
|
129
|
+
return '';
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
unsigned() {
|
|
133
|
+
return 'unsigned';
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
comment(comment) {
|
|
137
|
+
if (comment && comment.length > 255) {
|
|
138
|
+
this.client.logger.warn(
|
|
139
|
+
'Your comment is longer than the max comment length for MySQL'
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
return comment && `comment '${comment.replace(commentEscapeRegex, "\\'")}'`;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
first() {
|
|
146
|
+
return 'first';
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
after(column) {
|
|
150
|
+
return `after ${this.formatter.wrap(column)}`;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
collate(collation) {
|
|
154
|
+
return collation && `collate '${collation}'`;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
checkRegex(regex, constraintName) {
|
|
158
|
+
return this._check(
|
|
159
|
+
`${this.formatter.wrap(
|
|
160
|
+
this.getColumnName()
|
|
161
|
+
)} REGEXP ${this.client._escapeBinding(regex)}`,
|
|
162
|
+
constraintName
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
increments(options = { primaryKey: true }) {
|
|
167
|
+
return (
|
|
168
|
+
'int unsigned not null' +
|
|
169
|
+
// In MySQL autoincrement are always a primary key. If you already have a primary key, we
|
|
170
|
+
// initialize this column as classic int column then modify it later in table compiler
|
|
171
|
+
(this.tableCompiler._canBeAddPrimaryKey(options)
|
|
172
|
+
? ' auto_increment primary key'
|
|
173
|
+
: '')
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
bigincrements(options = { primaryKey: true }) {
|
|
178
|
+
return (
|
|
179
|
+
'bigint unsigned not null' +
|
|
180
|
+
// In MySQL autoincrement are always a primary key. If you already have a primary key, we
|
|
181
|
+
// initialize this column as classic int column then modify it later in table compiler
|
|
182
|
+
(this.tableCompiler._canBeAddPrimaryKey(options)
|
|
183
|
+
? ' auto_increment primary key'
|
|
184
|
+
: '')
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
ColumnCompiler_MySQL.prototype.bigint = 'bigint';
|
|
190
|
+
ColumnCompiler_MySQL.prototype.mediumint = 'mediumint';
|
|
191
|
+
ColumnCompiler_MySQL.prototype.smallint = 'smallint';
|
|
192
|
+
|
|
193
|
+
module.exports = ColumnCompiler_MySQL;
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
// MySQL Schema Compiler
|
|
2
|
-
// -------
|
|
3
|
-
const SchemaCompiler = require('../../../schema/compiler');
|
|
4
|
-
|
|
5
|
-
class SchemaCompiler_MySQL extends SchemaCompiler {
|
|
6
|
-
constructor(client, builder) {
|
|
7
|
-
super(client, builder);
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
// Rename a table on the schema.
|
|
11
|
-
renameTable(tableName, to) {
|
|
12
|
-
this.pushQuery(
|
|
13
|
-
`rename table ${this.formatter.wrap(tableName)} to ${this.formatter.wrap(
|
|
14
|
-
to
|
|
15
|
-
)}`
|
|
16
|
-
);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
renameView(from, to) {
|
|
20
|
-
this.renameTable(from, to);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// Check whether a table exists on the query.
|
|
24
|
-
hasTable(tableName) {
|
|
25
|
-
let sql = 'select * from information_schema.tables where table_name = ?';
|
|
26
|
-
const bindings = [tableName];
|
|
27
|
-
|
|
28
|
-
if (this.schema) {
|
|
29
|
-
sql += ' and table_schema = ?';
|
|
30
|
-
bindings.push(this.schema);
|
|
31
|
-
} else {
|
|
32
|
-
sql += ' and table_schema = database()';
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
this.pushQuery({
|
|
36
|
-
sql,
|
|
37
|
-
bindings,
|
|
38
|
-
output: function output(resp) {
|
|
39
|
-
return resp.length > 0;
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Check whether a column exists on the schema.
|
|
45
|
-
hasColumn(tableName, column) {
|
|
46
|
-
this.pushQuery({
|
|
47
|
-
sql: `show columns from ${this.formatter.wrap(tableName)}`,
|
|
48
|
-
output(resp) {
|
|
49
|
-
return resp.some((row) => {
|
|
50
|
-
return (
|
|
51
|
-
this.client.wrapIdentifier(row.Field.toLowerCase()) ===
|
|
52
|
-
this.client.wrapIdentifier(column.toLowerCase())
|
|
53
|
-
);
|
|
54
|
-
});
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
module.exports = SchemaCompiler_MySQL;
|
|
1
|
+
// MySQL Schema Compiler
|
|
2
|
+
// -------
|
|
3
|
+
const SchemaCompiler = require('../../../schema/compiler');
|
|
4
|
+
|
|
5
|
+
class SchemaCompiler_MySQL extends SchemaCompiler {
|
|
6
|
+
constructor(client, builder) {
|
|
7
|
+
super(client, builder);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
// Rename a table on the schema.
|
|
11
|
+
renameTable(tableName, to) {
|
|
12
|
+
this.pushQuery(
|
|
13
|
+
`rename table ${this.formatter.wrap(tableName)} to ${this.formatter.wrap(
|
|
14
|
+
to
|
|
15
|
+
)}`
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
renameView(from, to) {
|
|
20
|
+
this.renameTable(from, to);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Check whether a table exists on the query.
|
|
24
|
+
hasTable(tableName) {
|
|
25
|
+
let sql = 'select * from information_schema.tables where table_name = ?';
|
|
26
|
+
const bindings = [tableName];
|
|
27
|
+
|
|
28
|
+
if (this.schema) {
|
|
29
|
+
sql += ' and table_schema = ?';
|
|
30
|
+
bindings.push(this.schema);
|
|
31
|
+
} else {
|
|
32
|
+
sql += ' and table_schema = database()';
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
this.pushQuery({
|
|
36
|
+
sql,
|
|
37
|
+
bindings,
|
|
38
|
+
output: function output(resp) {
|
|
39
|
+
return resp.length > 0;
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Check whether a column exists on the schema.
|
|
45
|
+
hasColumn(tableName, column) {
|
|
46
|
+
this.pushQuery({
|
|
47
|
+
sql: `show columns from ${this.formatter.wrap(tableName)}`,
|
|
48
|
+
output(resp) {
|
|
49
|
+
return resp.some((row) => {
|
|
50
|
+
return (
|
|
51
|
+
this.client.wrapIdentifier(row.Field.toLowerCase()) ===
|
|
52
|
+
this.client.wrapIdentifier(column.toLowerCase())
|
|
53
|
+
);
|
|
54
|
+
});
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
module.exports = SchemaCompiler_MySQL;
|