knex 0.21.20 → 0.21.21
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 +6 -0
- package/CONTRIBUTING.md +184 -184
- package/LICENSE +22 -22
- package/README.md +95 -95
- package/bin/cli.js +414 -414
- package/bin/utils/cli-config-utils.js +151 -151
- package/bin/utils/constants.js +7 -7
- package/bin/utils/migrationsLister.js +37 -37
- package/knex.js +8 -8
- package/lib/client.js +413 -413
- package/lib/config-resolver.js +61 -61
- package/lib/constants.js +44 -44
- package/lib/dialects/mssql/index.js +390 -390
- package/lib/dialects/mssql/query/compiler.js +444 -444
- package/lib/dialects/mssql/schema/columncompiler.js +103 -103
- package/lib/dialects/mssql/schema/compiler.js +59 -59
- package/lib/dialects/mssql/schema/tablecompiler.js +245 -245
- package/lib/dialects/mssql/transaction.js +97 -97
- package/lib/dialects/mysql/index.js +191 -191
- package/lib/dialects/mysql/query/compiler.js +142 -142
- package/lib/dialects/mysql/schema/columncompiler.js +171 -171
- package/lib/dialects/mysql/schema/compiler.js +60 -60
- package/lib/dialects/mysql/schema/tablecompiler.js +262 -262
- package/lib/dialects/mysql/transaction.js +48 -48
- package/lib/dialects/mysql2/index.js +35 -35
- package/lib/dialects/mysql2/transaction.js +46 -46
- package/lib/dialects/oracle/DEAD_CODE.md +5 -5
- package/lib/dialects/oracle/formatter.js +20 -20
- package/lib/dialects/oracle/index.js +79 -79
- package/lib/dialects/oracle/query/compiler.js +327 -327
- package/lib/dialects/oracle/schema/columnbuilder.js +18 -18
- package/lib/dialects/oracle/schema/columncompiler.js +139 -139
- package/lib/dialects/oracle/schema/compiler.js +81 -81
- package/lib/dialects/oracle/schema/tablecompiler.js +165 -165
- package/lib/dialects/oracle/schema/trigger.js +126 -126
- package/lib/dialects/oracle/utils.js +86 -86
- package/lib/dialects/oracledb/index.js +489 -489
- package/lib/dialects/oracledb/query/compiler.js +363 -363
- package/lib/dialects/oracledb/schema/columncompiler.js +35 -35
- package/lib/dialects/oracledb/transaction.js +76 -76
- package/lib/dialects/oracledb/utils.js +14 -14
- package/lib/dialects/postgres/index.js +319 -319
- package/lib/dialects/postgres/query/compiler.js +206 -206
- package/lib/dialects/postgres/schema/columncompiler.js +125 -125
- package/lib/dialects/postgres/schema/compiler.js +109 -109
- package/lib/dialects/postgres/schema/tablecompiler.js +183 -183
- package/lib/dialects/redshift/index.js +73 -73
- package/lib/dialects/redshift/query/compiler.js +119 -119
- package/lib/dialects/redshift/schema/columnbuilder.js +20 -20
- package/lib/dialects/redshift/schema/columncompiler.js +60 -60
- package/lib/dialects/redshift/schema/compiler.js +14 -14
- package/lib/dialects/redshift/schema/tablecompiler.js +123 -123
- package/lib/dialects/redshift/transaction.js +18 -18
- package/lib/dialects/sqlite3/formatter.js +21 -21
- package/lib/dialects/sqlite3/index.js +169 -169
- package/lib/dialects/sqlite3/query/compiler.js +222 -222
- package/lib/dialects/sqlite3/schema/columncompiler.js +27 -27
- package/lib/dialects/sqlite3/schema/compiler.js +49 -49
- package/lib/dialects/sqlite3/schema/ddl.js +525 -525
- package/lib/dialects/sqlite3/schema/tablecompiler.js +238 -238
- package/lib/formatter.js +295 -295
- package/lib/functionhelper.js +14 -14
- package/lib/helpers.js +92 -92
- package/lib/index.js +3 -3
- package/lib/interface.js +115 -115
- package/lib/knex.js +42 -42
- package/lib/logger.js +76 -76
- package/lib/migrate/MigrationGenerator.js +82 -82
- package/lib/migrate/Migrator.js +611 -611
- package/lib/migrate/configuration-merger.js +60 -60
- package/lib/migrate/migrate-stub.js +17 -17
- package/lib/migrate/migration-list-resolver.js +36 -36
- package/lib/migrate/sources/fs-migrations.js +99 -99
- package/lib/migrate/stub/cjs.stub +15 -15
- package/lib/migrate/stub/coffee.stub +13 -13
- package/lib/migrate/stub/eg.stub +14 -14
- package/lib/migrate/stub/js.stub +15 -15
- package/lib/migrate/stub/knexfile-coffee.stub +34 -34
- package/lib/migrate/stub/knexfile-eg.stub +43 -43
- package/lib/migrate/stub/knexfile-js.stub +44 -44
- package/lib/migrate/stub/knexfile-ls.stub +35 -35
- package/lib/migrate/stub/knexfile-ts.stub +44 -44
- package/lib/migrate/stub/ls.stub +14 -14
- package/lib/migrate/stub/ts.stub +21 -21
- package/lib/migrate/table-creator.js +67 -67
- package/lib/migrate/table-resolver.js +27 -27
- package/lib/query/builder.js +1372 -1372
- package/lib/query/compiler.js +889 -889
- package/lib/query/constants.js +13 -13
- package/lib/query/joinclause.js +263 -263
- package/lib/query/methods.js +92 -92
- package/lib/query/string.js +190 -190
- package/lib/raw.js +188 -188
- package/lib/ref.js +39 -39
- package/lib/runner.js +285 -285
- package/lib/schema/builder.js +82 -82
- package/lib/schema/columnbuilder.js +117 -117
- package/lib/schema/columncompiler.js +177 -177
- package/lib/schema/compiler.js +101 -101
- package/lib/schema/helpers.js +51 -51
- package/lib/schema/tablebuilder.js +288 -288
- package/lib/schema/tablecompiler.js +296 -296
- package/lib/seed/Seeder.js +203 -203
- package/lib/seed/seed-stub.js +13 -13
- package/lib/seed/stub/coffee.stub +9 -9
- package/lib/seed/stub/eg.stub +11 -11
- package/lib/seed/stub/js.stub +13 -13
- package/lib/seed/stub/ls.stub +11 -11
- package/lib/seed/stub/ts.stub +13 -13
- package/lib/transaction.js +363 -363
- package/lib/util/batchInsert.js +59 -59
- package/lib/util/delay.js +6 -6
- package/lib/util/fake-client.js +9 -9
- package/lib/util/finally-mixin.js +13 -13
- package/lib/util/fs.js +76 -76
- package/lib/util/import-file.js +13 -13
- package/lib/util/is-module-type.js +14 -14
- package/lib/util/is.js +32 -32
- package/lib/util/make-knex.js +338 -338
- package/lib/util/nanoid.js +29 -29
- package/lib/util/noop.js +1 -1
- package/lib/util/parse-connection.js +66 -66
- package/lib/util/save-async-stack.js +14 -14
- package/lib/util/template.js +52 -52
- package/lib/util/timeout.js +29 -29
- package/lib/util/timestamp.js +16 -16
- package/package.json +1 -1
- package/scripts/build.js +125 -125
- package/scripts/docker-compose.yml +111 -111
- package/scripts/next-release-howto.md +24 -24
- package/scripts/release.sh +34 -34
- package/scripts/runkit-example.js +34 -34
- package/scripts/stress-test/README.txt +18 -18
- package/scripts/stress-test/docker-compose.yml +47 -47
- package/scripts/stress-test/knex-stress-test.js +196 -196
- package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +145 -145
- package/scripts/stress-test/mysql2-sudden-exit-without-error.js +100 -100
- package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +184 -184
- package/types/index.d.ts +2249 -2249
- package/types/result.d.ts +27 -27
- package/types/tables.d.ts +4 -4
|
@@ -1,245 +1,245 @@
|
|
|
1
|
-
/* eslint max-len:0 */
|
|
2
|
-
|
|
3
|
-
// MSSQL Table Builder & Compiler
|
|
4
|
-
// -------
|
|
5
|
-
const { inherits } = require('util');
|
|
6
|
-
const TableCompiler = require('../../../schema/tablecompiler');
|
|
7
|
-
const helpers = require('../../../helpers');
|
|
8
|
-
|
|
9
|
-
// Table Compiler
|
|
10
|
-
// ------
|
|
11
|
-
|
|
12
|
-
function TableCompiler_MSSQL() {
|
|
13
|
-
TableCompiler.apply(this, arguments);
|
|
14
|
-
}
|
|
15
|
-
inherits(TableCompiler_MSSQL, TableCompiler);
|
|
16
|
-
|
|
17
|
-
Object.assign(TableCompiler_MSSQL.prototype, {
|
|
18
|
-
createAlterTableMethods: ['foreign', 'primary'],
|
|
19
|
-
createQuery(columns, ifNot) {
|
|
20
|
-
const createStatement = ifNot
|
|
21
|
-
? `if object_id('${this.tableName()}', 'U') is null CREATE TABLE `
|
|
22
|
-
: 'CREATE TABLE ';
|
|
23
|
-
const sql =
|
|
24
|
-
createStatement +
|
|
25
|
-
this.tableName() +
|
|
26
|
-
(this._formatting ? ' (\n ' : ' (') +
|
|
27
|
-
columns.sql.join(this._formatting ? ',\n ' : ', ') +
|
|
28
|
-
')';
|
|
29
|
-
|
|
30
|
-
if (this.single.comment) {
|
|
31
|
-
const { comment } = this.single;
|
|
32
|
-
if (comment.length > 60)
|
|
33
|
-
this.client.logger.warn(
|
|
34
|
-
'The max length for a table comment is 60 characters'
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
this.pushQuery(sql);
|
|
39
|
-
},
|
|
40
|
-
|
|
41
|
-
lowerCase: false,
|
|
42
|
-
|
|
43
|
-
addColumnsPrefix: 'ADD ',
|
|
44
|
-
|
|
45
|
-
dropColumnPrefix: 'DROP COLUMN ',
|
|
46
|
-
|
|
47
|
-
alterColumnPrefix: 'ALTER COLUMN ',
|
|
48
|
-
|
|
49
|
-
// Compiles column add. Multiple columns need only one ADD clause (not one ADD per column) so core addColumns doesn't work. #1348
|
|
50
|
-
addColumns(columns, prefix) {
|
|
51
|
-
prefix = prefix || this.addColumnsPrefix;
|
|
52
|
-
|
|
53
|
-
if (columns.sql.length > 0) {
|
|
54
|
-
this.pushQuery({
|
|
55
|
-
sql:
|
|
56
|
-
(this.lowerCase ? 'alter table ' : 'ALTER TABLE ') +
|
|
57
|
-
this.tableName() +
|
|
58
|
-
' ' +
|
|
59
|
-
prefix +
|
|
60
|
-
columns.sql.join(', '),
|
|
61
|
-
bindings: columns.bindings,
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
},
|
|
65
|
-
|
|
66
|
-
// Compiles column drop. Multiple columns need only one DROP clause (not one DROP per column) so core dropColumn doesn't work. #1348
|
|
67
|
-
dropColumn() {
|
|
68
|
-
const _this2 = this;
|
|
69
|
-
const columns = helpers.normalizeArr.apply(null, arguments);
|
|
70
|
-
const columnsArray = Array.isArray(columns) ? columns : [columns];
|
|
71
|
-
const drops = columnsArray.map((column) => _this2.formatter.wrap(column));
|
|
72
|
-
const schema = this.schemaNameRaw || 'dbo';
|
|
73
|
-
|
|
74
|
-
for (const column of columns) {
|
|
75
|
-
const baseQuery = `
|
|
76
|
-
DECLARE @constraint varchar(100) = (SELECT default_constraints.name
|
|
77
|
-
FROM sys.all_columns
|
|
78
|
-
INNER JOIN sys.tables
|
|
79
|
-
ON all_columns.object_id = tables.object_id
|
|
80
|
-
INNER JOIN sys.schemas
|
|
81
|
-
ON tables.schema_id = schemas.schema_id
|
|
82
|
-
INNER JOIN sys.default_constraints
|
|
83
|
-
ON all_columns.default_object_id = default_constraints.object_id
|
|
84
|
-
WHERE schemas.name = '${schema}'
|
|
85
|
-
AND tables.name = '${this.tableNameRaw}'
|
|
86
|
-
AND all_columns.name = '${column}')
|
|
87
|
-
|
|
88
|
-
IF @constraint IS NOT NULL EXEC('ALTER TABLE ${this.tableNameRaw} DROP CONSTRAINT ' + @constraint)`;
|
|
89
|
-
this.pushQuery(baseQuery);
|
|
90
|
-
}
|
|
91
|
-
this.pushQuery(
|
|
92
|
-
(this.lowerCase ? 'alter table ' : 'ALTER TABLE ') +
|
|
93
|
-
this.tableName() +
|
|
94
|
-
' ' +
|
|
95
|
-
this.dropColumnPrefix +
|
|
96
|
-
drops.join(', ')
|
|
97
|
-
);
|
|
98
|
-
},
|
|
99
|
-
|
|
100
|
-
// Compiles the comment on the table.
|
|
101
|
-
comment() {},
|
|
102
|
-
|
|
103
|
-
changeType() {},
|
|
104
|
-
|
|
105
|
-
// Renames a column on the table.
|
|
106
|
-
renameColumn(from, to) {
|
|
107
|
-
this.pushQuery(
|
|
108
|
-
`exec sp_rename ${this.formatter.parameter(
|
|
109
|
-
this.tableName() + '.' + from
|
|
110
|
-
)}, ${this.formatter.parameter(to)}, 'COLUMN'`
|
|
111
|
-
);
|
|
112
|
-
},
|
|
113
|
-
|
|
114
|
-
dropFKRefs(runner, refs) {
|
|
115
|
-
const formatter = this.client.formatter(this.tableBuilder);
|
|
116
|
-
return Promise.all(
|
|
117
|
-
refs.map(function (ref) {
|
|
118
|
-
const constraintName = formatter.wrap(ref.CONSTRAINT_NAME);
|
|
119
|
-
const tableName = formatter.wrap(ref.TABLE_NAME);
|
|
120
|
-
return runner.query({
|
|
121
|
-
sql: `ALTER TABLE ${tableName} DROP CONSTRAINT ${constraintName}`,
|
|
122
|
-
});
|
|
123
|
-
})
|
|
124
|
-
);
|
|
125
|
-
},
|
|
126
|
-
createFKRefs(runner, refs) {
|
|
127
|
-
const formatter = this.client.formatter(this.tableBuilder);
|
|
128
|
-
|
|
129
|
-
return Promise.all(
|
|
130
|
-
refs.map(function (ref) {
|
|
131
|
-
const tableName = formatter.wrap(ref.TABLE_NAME);
|
|
132
|
-
const keyName = formatter.wrap(ref.CONSTRAINT_NAME);
|
|
133
|
-
const column = formatter.columnize(ref.COLUMN_NAME);
|
|
134
|
-
const references = formatter.columnize(ref.REFERENCED_COLUMN_NAME);
|
|
135
|
-
const inTable = formatter.wrap(ref.REFERENCED_TABLE_NAME);
|
|
136
|
-
const onUpdate = ` ON UPDATE ${ref.UPDATE_RULE}`;
|
|
137
|
-
const onDelete = ` ON DELETE ${ref.DELETE_RULE}`;
|
|
138
|
-
|
|
139
|
-
return runner.query({
|
|
140
|
-
sql:
|
|
141
|
-
`ALTER TABLE ${tableName} ADD CONSTRAINT ${keyName}` +
|
|
142
|
-
' FOREIGN KEY (' +
|
|
143
|
-
column +
|
|
144
|
-
') REFERENCES ' +
|
|
145
|
-
inTable +
|
|
146
|
-
' (' +
|
|
147
|
-
references +
|
|
148
|
-
')' +
|
|
149
|
-
onUpdate +
|
|
150
|
-
onDelete,
|
|
151
|
-
});
|
|
152
|
-
})
|
|
153
|
-
);
|
|
154
|
-
},
|
|
155
|
-
|
|
156
|
-
index(columns, indexName) {
|
|
157
|
-
indexName = indexName
|
|
158
|
-
? this.formatter.wrap(indexName)
|
|
159
|
-
: this._indexCommand('index', this.tableNameRaw, columns);
|
|
160
|
-
this.pushQuery(
|
|
161
|
-
`CREATE INDEX ${indexName} ON ${this.tableName()} (${this.formatter.columnize(
|
|
162
|
-
columns
|
|
163
|
-
)})`
|
|
164
|
-
);
|
|
165
|
-
},
|
|
166
|
-
|
|
167
|
-
primary(columns, constraintName) {
|
|
168
|
-
constraintName = constraintName
|
|
169
|
-
? this.formatter.wrap(constraintName)
|
|
170
|
-
: this.formatter.wrap(`${this.tableNameRaw}_pkey`);
|
|
171
|
-
if (!this.forCreate) {
|
|
172
|
-
this.pushQuery(
|
|
173
|
-
`ALTER TABLE ${this.tableName()} ADD CONSTRAINT ${constraintName} PRIMARY KEY (${this.formatter.columnize(
|
|
174
|
-
columns
|
|
175
|
-
)})`
|
|
176
|
-
);
|
|
177
|
-
} else {
|
|
178
|
-
this.pushQuery(
|
|
179
|
-
`CONSTRAINT ${constraintName} PRIMARY KEY (${this.formatter.columnize(
|
|
180
|
-
columns
|
|
181
|
-
)})`
|
|
182
|
-
);
|
|
183
|
-
}
|
|
184
|
-
},
|
|
185
|
-
|
|
186
|
-
unique(columns, indexName) {
|
|
187
|
-
indexName = indexName
|
|
188
|
-
? this.formatter.wrap(indexName)
|
|
189
|
-
: this._indexCommand('unique', this.tableNameRaw, columns);
|
|
190
|
-
|
|
191
|
-
if (!Array.isArray(columns)) {
|
|
192
|
-
columns = [columns];
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
const whereAllTheColumnsAreNotNull = columns
|
|
196
|
-
.map((column) => this.formatter.columnize(column) + ' IS NOT NULL')
|
|
197
|
-
.join(' AND ');
|
|
198
|
-
|
|
199
|
-
// make unique constraint that allows null https://stackoverflow.com/a/767702/360060
|
|
200
|
-
// to be more or less compatible with other DBs (if any of the columns is NULL then "duplicates" are allowed)
|
|
201
|
-
this.pushQuery(
|
|
202
|
-
`CREATE UNIQUE INDEX ${indexName} ON ${this.tableName()} (${this.formatter.columnize(
|
|
203
|
-
columns
|
|
204
|
-
)}) WHERE ${whereAllTheColumnsAreNotNull}`
|
|
205
|
-
);
|
|
206
|
-
},
|
|
207
|
-
|
|
208
|
-
// Compile a drop index command.
|
|
209
|
-
dropIndex(columns, indexName) {
|
|
210
|
-
indexName = indexName
|
|
211
|
-
? this.formatter.wrap(indexName)
|
|
212
|
-
: this._indexCommand('index', this.tableNameRaw, columns);
|
|
213
|
-
this.pushQuery(`DROP INDEX ${indexName} ON ${this.tableName()}`);
|
|
214
|
-
},
|
|
215
|
-
|
|
216
|
-
// Compile a drop foreign key command.
|
|
217
|
-
dropForeign(columns, indexName) {
|
|
218
|
-
indexName = indexName
|
|
219
|
-
? this.formatter.wrap(indexName)
|
|
220
|
-
: this._indexCommand('foreign', this.tableNameRaw, columns);
|
|
221
|
-
this.pushQuery(
|
|
222
|
-
`ALTER TABLE ${this.tableName()} DROP CONSTRAINT ${indexName}`
|
|
223
|
-
);
|
|
224
|
-
},
|
|
225
|
-
|
|
226
|
-
// Compile a drop primary key command.
|
|
227
|
-
dropPrimary(constraintName) {
|
|
228
|
-
constraintName = constraintName
|
|
229
|
-
? this.formatter.wrap(constraintName)
|
|
230
|
-
: this.formatter.wrap(`${this.tableNameRaw}_pkey`);
|
|
231
|
-
this.pushQuery(
|
|
232
|
-
`ALTER TABLE ${this.tableName()} DROP CONSTRAINT ${constraintName}`
|
|
233
|
-
);
|
|
234
|
-
},
|
|
235
|
-
|
|
236
|
-
// Compile a drop unique key command.
|
|
237
|
-
dropUnique(column, indexName) {
|
|
238
|
-
indexName = indexName
|
|
239
|
-
? this.formatter.wrap(indexName)
|
|
240
|
-
: this._indexCommand('unique', this.tableNameRaw, column);
|
|
241
|
-
this.pushQuery(`DROP INDEX ${indexName} ON ${this.tableName()}`);
|
|
242
|
-
},
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
module.exports = TableCompiler_MSSQL;
|
|
1
|
+
/* eslint max-len:0 */
|
|
2
|
+
|
|
3
|
+
// MSSQL Table Builder & Compiler
|
|
4
|
+
// -------
|
|
5
|
+
const { inherits } = require('util');
|
|
6
|
+
const TableCompiler = require('../../../schema/tablecompiler');
|
|
7
|
+
const helpers = require('../../../helpers');
|
|
8
|
+
|
|
9
|
+
// Table Compiler
|
|
10
|
+
// ------
|
|
11
|
+
|
|
12
|
+
function TableCompiler_MSSQL() {
|
|
13
|
+
TableCompiler.apply(this, arguments);
|
|
14
|
+
}
|
|
15
|
+
inherits(TableCompiler_MSSQL, TableCompiler);
|
|
16
|
+
|
|
17
|
+
Object.assign(TableCompiler_MSSQL.prototype, {
|
|
18
|
+
createAlterTableMethods: ['foreign', 'primary'],
|
|
19
|
+
createQuery(columns, ifNot) {
|
|
20
|
+
const createStatement = ifNot
|
|
21
|
+
? `if object_id('${this.tableName()}', 'U') is null CREATE TABLE `
|
|
22
|
+
: 'CREATE TABLE ';
|
|
23
|
+
const sql =
|
|
24
|
+
createStatement +
|
|
25
|
+
this.tableName() +
|
|
26
|
+
(this._formatting ? ' (\n ' : ' (') +
|
|
27
|
+
columns.sql.join(this._formatting ? ',\n ' : ', ') +
|
|
28
|
+
')';
|
|
29
|
+
|
|
30
|
+
if (this.single.comment) {
|
|
31
|
+
const { comment } = this.single;
|
|
32
|
+
if (comment.length > 60)
|
|
33
|
+
this.client.logger.warn(
|
|
34
|
+
'The max length for a table comment is 60 characters'
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
this.pushQuery(sql);
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
lowerCase: false,
|
|
42
|
+
|
|
43
|
+
addColumnsPrefix: 'ADD ',
|
|
44
|
+
|
|
45
|
+
dropColumnPrefix: 'DROP COLUMN ',
|
|
46
|
+
|
|
47
|
+
alterColumnPrefix: 'ALTER COLUMN ',
|
|
48
|
+
|
|
49
|
+
// Compiles column add. Multiple columns need only one ADD clause (not one ADD per column) so core addColumns doesn't work. #1348
|
|
50
|
+
addColumns(columns, prefix) {
|
|
51
|
+
prefix = prefix || this.addColumnsPrefix;
|
|
52
|
+
|
|
53
|
+
if (columns.sql.length > 0) {
|
|
54
|
+
this.pushQuery({
|
|
55
|
+
sql:
|
|
56
|
+
(this.lowerCase ? 'alter table ' : 'ALTER TABLE ') +
|
|
57
|
+
this.tableName() +
|
|
58
|
+
' ' +
|
|
59
|
+
prefix +
|
|
60
|
+
columns.sql.join(', '),
|
|
61
|
+
bindings: columns.bindings,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
// Compiles column drop. Multiple columns need only one DROP clause (not one DROP per column) so core dropColumn doesn't work. #1348
|
|
67
|
+
dropColumn() {
|
|
68
|
+
const _this2 = this;
|
|
69
|
+
const columns = helpers.normalizeArr.apply(null, arguments);
|
|
70
|
+
const columnsArray = Array.isArray(columns) ? columns : [columns];
|
|
71
|
+
const drops = columnsArray.map((column) => _this2.formatter.wrap(column));
|
|
72
|
+
const schema = this.schemaNameRaw || 'dbo';
|
|
73
|
+
|
|
74
|
+
for (const column of columns) {
|
|
75
|
+
const baseQuery = `
|
|
76
|
+
DECLARE @constraint varchar(100) = (SELECT default_constraints.name
|
|
77
|
+
FROM sys.all_columns
|
|
78
|
+
INNER JOIN sys.tables
|
|
79
|
+
ON all_columns.object_id = tables.object_id
|
|
80
|
+
INNER JOIN sys.schemas
|
|
81
|
+
ON tables.schema_id = schemas.schema_id
|
|
82
|
+
INNER JOIN sys.default_constraints
|
|
83
|
+
ON all_columns.default_object_id = default_constraints.object_id
|
|
84
|
+
WHERE schemas.name = '${schema}'
|
|
85
|
+
AND tables.name = '${this.tableNameRaw}'
|
|
86
|
+
AND all_columns.name = '${column}')
|
|
87
|
+
|
|
88
|
+
IF @constraint IS NOT NULL EXEC('ALTER TABLE ${this.tableNameRaw} DROP CONSTRAINT ' + @constraint)`;
|
|
89
|
+
this.pushQuery(baseQuery);
|
|
90
|
+
}
|
|
91
|
+
this.pushQuery(
|
|
92
|
+
(this.lowerCase ? 'alter table ' : 'ALTER TABLE ') +
|
|
93
|
+
this.tableName() +
|
|
94
|
+
' ' +
|
|
95
|
+
this.dropColumnPrefix +
|
|
96
|
+
drops.join(', ')
|
|
97
|
+
);
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
// Compiles the comment on the table.
|
|
101
|
+
comment() {},
|
|
102
|
+
|
|
103
|
+
changeType() {},
|
|
104
|
+
|
|
105
|
+
// Renames a column on the table.
|
|
106
|
+
renameColumn(from, to) {
|
|
107
|
+
this.pushQuery(
|
|
108
|
+
`exec sp_rename ${this.formatter.parameter(
|
|
109
|
+
this.tableName() + '.' + from
|
|
110
|
+
)}, ${this.formatter.parameter(to)}, 'COLUMN'`
|
|
111
|
+
);
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
dropFKRefs(runner, refs) {
|
|
115
|
+
const formatter = this.client.formatter(this.tableBuilder);
|
|
116
|
+
return Promise.all(
|
|
117
|
+
refs.map(function (ref) {
|
|
118
|
+
const constraintName = formatter.wrap(ref.CONSTRAINT_NAME);
|
|
119
|
+
const tableName = formatter.wrap(ref.TABLE_NAME);
|
|
120
|
+
return runner.query({
|
|
121
|
+
sql: `ALTER TABLE ${tableName} DROP CONSTRAINT ${constraintName}`,
|
|
122
|
+
});
|
|
123
|
+
})
|
|
124
|
+
);
|
|
125
|
+
},
|
|
126
|
+
createFKRefs(runner, refs) {
|
|
127
|
+
const formatter = this.client.formatter(this.tableBuilder);
|
|
128
|
+
|
|
129
|
+
return Promise.all(
|
|
130
|
+
refs.map(function (ref) {
|
|
131
|
+
const tableName = formatter.wrap(ref.TABLE_NAME);
|
|
132
|
+
const keyName = formatter.wrap(ref.CONSTRAINT_NAME);
|
|
133
|
+
const column = formatter.columnize(ref.COLUMN_NAME);
|
|
134
|
+
const references = formatter.columnize(ref.REFERENCED_COLUMN_NAME);
|
|
135
|
+
const inTable = formatter.wrap(ref.REFERENCED_TABLE_NAME);
|
|
136
|
+
const onUpdate = ` ON UPDATE ${ref.UPDATE_RULE}`;
|
|
137
|
+
const onDelete = ` ON DELETE ${ref.DELETE_RULE}`;
|
|
138
|
+
|
|
139
|
+
return runner.query({
|
|
140
|
+
sql:
|
|
141
|
+
`ALTER TABLE ${tableName} ADD CONSTRAINT ${keyName}` +
|
|
142
|
+
' FOREIGN KEY (' +
|
|
143
|
+
column +
|
|
144
|
+
') REFERENCES ' +
|
|
145
|
+
inTable +
|
|
146
|
+
' (' +
|
|
147
|
+
references +
|
|
148
|
+
')' +
|
|
149
|
+
onUpdate +
|
|
150
|
+
onDelete,
|
|
151
|
+
});
|
|
152
|
+
})
|
|
153
|
+
);
|
|
154
|
+
},
|
|
155
|
+
|
|
156
|
+
index(columns, indexName) {
|
|
157
|
+
indexName = indexName
|
|
158
|
+
? this.formatter.wrap(indexName)
|
|
159
|
+
: this._indexCommand('index', this.tableNameRaw, columns);
|
|
160
|
+
this.pushQuery(
|
|
161
|
+
`CREATE INDEX ${indexName} ON ${this.tableName()} (${this.formatter.columnize(
|
|
162
|
+
columns
|
|
163
|
+
)})`
|
|
164
|
+
);
|
|
165
|
+
},
|
|
166
|
+
|
|
167
|
+
primary(columns, constraintName) {
|
|
168
|
+
constraintName = constraintName
|
|
169
|
+
? this.formatter.wrap(constraintName)
|
|
170
|
+
: this.formatter.wrap(`${this.tableNameRaw}_pkey`);
|
|
171
|
+
if (!this.forCreate) {
|
|
172
|
+
this.pushQuery(
|
|
173
|
+
`ALTER TABLE ${this.tableName()} ADD CONSTRAINT ${constraintName} PRIMARY KEY (${this.formatter.columnize(
|
|
174
|
+
columns
|
|
175
|
+
)})`
|
|
176
|
+
);
|
|
177
|
+
} else {
|
|
178
|
+
this.pushQuery(
|
|
179
|
+
`CONSTRAINT ${constraintName} PRIMARY KEY (${this.formatter.columnize(
|
|
180
|
+
columns
|
|
181
|
+
)})`
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
|
|
186
|
+
unique(columns, indexName) {
|
|
187
|
+
indexName = indexName
|
|
188
|
+
? this.formatter.wrap(indexName)
|
|
189
|
+
: this._indexCommand('unique', this.tableNameRaw, columns);
|
|
190
|
+
|
|
191
|
+
if (!Array.isArray(columns)) {
|
|
192
|
+
columns = [columns];
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const whereAllTheColumnsAreNotNull = columns
|
|
196
|
+
.map((column) => this.formatter.columnize(column) + ' IS NOT NULL')
|
|
197
|
+
.join(' AND ');
|
|
198
|
+
|
|
199
|
+
// make unique constraint that allows null https://stackoverflow.com/a/767702/360060
|
|
200
|
+
// to be more or less compatible with other DBs (if any of the columns is NULL then "duplicates" are allowed)
|
|
201
|
+
this.pushQuery(
|
|
202
|
+
`CREATE UNIQUE INDEX ${indexName} ON ${this.tableName()} (${this.formatter.columnize(
|
|
203
|
+
columns
|
|
204
|
+
)}) WHERE ${whereAllTheColumnsAreNotNull}`
|
|
205
|
+
);
|
|
206
|
+
},
|
|
207
|
+
|
|
208
|
+
// Compile a drop index command.
|
|
209
|
+
dropIndex(columns, indexName) {
|
|
210
|
+
indexName = indexName
|
|
211
|
+
? this.formatter.wrap(indexName)
|
|
212
|
+
: this._indexCommand('index', this.tableNameRaw, columns);
|
|
213
|
+
this.pushQuery(`DROP INDEX ${indexName} ON ${this.tableName()}`);
|
|
214
|
+
},
|
|
215
|
+
|
|
216
|
+
// Compile a drop foreign key command.
|
|
217
|
+
dropForeign(columns, indexName) {
|
|
218
|
+
indexName = indexName
|
|
219
|
+
? this.formatter.wrap(indexName)
|
|
220
|
+
: this._indexCommand('foreign', this.tableNameRaw, columns);
|
|
221
|
+
this.pushQuery(
|
|
222
|
+
`ALTER TABLE ${this.tableName()} DROP CONSTRAINT ${indexName}`
|
|
223
|
+
);
|
|
224
|
+
},
|
|
225
|
+
|
|
226
|
+
// Compile a drop primary key command.
|
|
227
|
+
dropPrimary(constraintName) {
|
|
228
|
+
constraintName = constraintName
|
|
229
|
+
? this.formatter.wrap(constraintName)
|
|
230
|
+
: this.formatter.wrap(`${this.tableNameRaw}_pkey`);
|
|
231
|
+
this.pushQuery(
|
|
232
|
+
`ALTER TABLE ${this.tableName()} DROP CONSTRAINT ${constraintName}`
|
|
233
|
+
);
|
|
234
|
+
},
|
|
235
|
+
|
|
236
|
+
// Compile a drop unique key command.
|
|
237
|
+
dropUnique(column, indexName) {
|
|
238
|
+
indexName = indexName
|
|
239
|
+
? this.formatter.wrap(indexName)
|
|
240
|
+
: this._indexCommand('unique', this.tableNameRaw, column);
|
|
241
|
+
this.pushQuery(`DROP INDEX ${indexName} ON ${this.tableName()}`);
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
module.exports = TableCompiler_MSSQL;
|