@strapi/database 5.6.0 → 5.7.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/dist/dialects/dialect.d.ts +3 -1
- package/dist/dialects/dialect.d.ts.map +1 -1
- package/dist/index.js +53 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +53 -26
- package/dist/index.mjs.map +1 -1
- package/dist/schema/builder.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/index.mjs
CHANGED
|
@@ -1039,6 +1039,13 @@ const createSchemaBuilder = (db) => {
|
|
|
1039
1039
|
async updateSchema(schemaDiff) {
|
|
1040
1040
|
const forceMigration = db.config.settings?.forceMigration;
|
|
1041
1041
|
await db.dialect.startSchemaUpdate();
|
|
1042
|
+
const existingMetadata = {};
|
|
1043
|
+
for (const table of schemaDiff.tables.updated) {
|
|
1044
|
+
existingMetadata[table.name] = {
|
|
1045
|
+
indexes: await db.dialect.schemaInspector.getIndexes(table.name),
|
|
1046
|
+
foreignKeys: await db.dialect.schemaInspector.getForeignKeys(table.name)
|
|
1047
|
+
};
|
|
1048
|
+
}
|
|
1042
1049
|
await db.connection.transaction(async (trx) => {
|
|
1043
1050
|
await this.createTables(schemaDiff.tables.added, trx);
|
|
1044
1051
|
if (forceMigration) {
|
|
@@ -1056,7 +1063,8 @@ const createSchemaBuilder = (db) => {
|
|
|
1056
1063
|
for (const table of schemaDiff.tables.updated) {
|
|
1057
1064
|
debug$2(`Updating table: ${table.name}`);
|
|
1058
1065
|
const schemaBuilder = this.getSchemaBuilder(trx);
|
|
1059
|
-
|
|
1066
|
+
const { indexes, foreignKeys } = existingMetadata[table.name];
|
|
1067
|
+
await helpers2.alterTable(schemaBuilder, table, { indexes, foreignKeys });
|
|
1060
1068
|
}
|
|
1061
1069
|
});
|
|
1062
1070
|
await db.dialect.endSchemaUpdate();
|
|
@@ -1064,8 +1072,14 @@ const createSchemaBuilder = (db) => {
|
|
|
1064
1072
|
};
|
|
1065
1073
|
};
|
|
1066
1074
|
const createHelpers = (db) => {
|
|
1067
|
-
const createForeignKey = (tableBuilder, foreignKey) => {
|
|
1075
|
+
const createForeignKey = (tableBuilder, foreignKey, existingForeignKeys) => {
|
|
1068
1076
|
const { name, columns, referencedColumns, referencedTable, onDelete, onUpdate } = foreignKey;
|
|
1077
|
+
const existingForeignKey = existingForeignKeys?.find((fk) => fk.name === name);
|
|
1078
|
+
const forceMigration = db.config.settings?.forceMigration;
|
|
1079
|
+
if (existingForeignKey && forceMigration) {
|
|
1080
|
+
debug$2(`Dropping existing foreign key ${name}`);
|
|
1081
|
+
tableBuilder.dropForeign(existingForeignKey.columns, name);
|
|
1082
|
+
}
|
|
1069
1083
|
const constraint = tableBuilder.foreign(columns, name).references(referencedColumns).inTable(db.getSchemaName() ? `${db.getSchemaName()}.${referencedTable}` : referencedTable);
|
|
1070
1084
|
if (onDelete) {
|
|
1071
1085
|
constraint.onDelete(onDelete);
|
|
@@ -1078,25 +1092,34 @@ const createHelpers = (db) => {
|
|
|
1078
1092
|
const { name, columns } = foreignKey;
|
|
1079
1093
|
tableBuilder.dropForeign(columns, name);
|
|
1080
1094
|
};
|
|
1081
|
-
const createIndex = (tableBuilder, index2) => {
|
|
1095
|
+
const createIndex = (tableBuilder, index2, existingIndexes) => {
|
|
1082
1096
|
const { type, columns, name } = index2;
|
|
1097
|
+
const existingIndex = existingIndexes?.find((existing) => existing.name === name);
|
|
1098
|
+
const forceMigration = db.config.settings?.forceMigration;
|
|
1099
|
+
if (forceMigration && existingIndex) {
|
|
1100
|
+
dropIndex2(tableBuilder, index2);
|
|
1101
|
+
}
|
|
1083
1102
|
switch (type) {
|
|
1084
1103
|
case "primary": {
|
|
1085
|
-
return tableBuilder.primary(columns, name);
|
|
1104
|
+
return tableBuilder.primary(columns, { constraintName: name });
|
|
1086
1105
|
}
|
|
1087
1106
|
case "unique": {
|
|
1088
|
-
return tableBuilder.unique(columns, name);
|
|
1107
|
+
return tableBuilder.unique(columns, { indexName: name });
|
|
1089
1108
|
}
|
|
1090
1109
|
default: {
|
|
1091
1110
|
return tableBuilder.index(columns, name, type);
|
|
1092
1111
|
}
|
|
1093
1112
|
}
|
|
1094
1113
|
};
|
|
1095
|
-
const dropIndex2 = (tableBuilder, index2) => {
|
|
1114
|
+
const dropIndex2 = (tableBuilder, index2, existingIndexes) => {
|
|
1096
1115
|
if (!db.config.settings?.forceMigration) {
|
|
1097
1116
|
return;
|
|
1098
1117
|
}
|
|
1099
1118
|
const { type, columns, name } = index2;
|
|
1119
|
+
if (existingIndexes && !existingIndexes.some((existingIndex) => existingIndex?.name === name)) {
|
|
1120
|
+
debug$2(`Index ${index2.name} not found in existingIndexes. Skipping drop.`);
|
|
1121
|
+
return;
|
|
1122
|
+
}
|
|
1100
1123
|
switch (type) {
|
|
1101
1124
|
case "primary": {
|
|
1102
1125
|
return tableBuilder.dropPrimary(name);
|
|
@@ -1147,32 +1170,36 @@ const createHelpers = (db) => {
|
|
|
1147
1170
|
}
|
|
1148
1171
|
});
|
|
1149
1172
|
};
|
|
1150
|
-
const alterTable = async (schemaBuilder, table
|
|
1151
|
-
|
|
1173
|
+
const alterTable = async (schemaBuilder, table, existingMetadata = {
|
|
1174
|
+
indexes: [],
|
|
1175
|
+
foreignKeys: []
|
|
1176
|
+
}) => {
|
|
1177
|
+
let existingIndexes = [...existingMetadata.indexes];
|
|
1178
|
+
const existingForeignKeys = [...existingMetadata.foreignKeys];
|
|
1179
|
+
const droppedForeignKeyNames = [];
|
|
1180
|
+
await schemaBuilder.alterTable(table.name, async (tableBuilder) => {
|
|
1152
1181
|
for (const removedForeignKey of table.foreignKeys.removed) {
|
|
1153
1182
|
debug$2(`Dropping foreign key ${removedForeignKey.name} on ${table.name}`);
|
|
1154
1183
|
dropForeignKey(tableBuilder, removedForeignKey);
|
|
1184
|
+
droppedForeignKeyNames.push(removedForeignKey.name);
|
|
1155
1185
|
}
|
|
1156
1186
|
for (const updatedForeignKey of table.foreignKeys.updated) {
|
|
1157
1187
|
debug$2(`Dropping updated foreign key ${updatedForeignKey.name} on ${table.name}`);
|
|
1158
1188
|
dropForeignKey(tableBuilder, updatedForeignKey.object);
|
|
1189
|
+
droppedForeignKeyNames.push(updatedForeignKey.object.name);
|
|
1190
|
+
}
|
|
1191
|
+
if (db.config.connection.client === "mysql") {
|
|
1192
|
+
existingIndexes = existingIndexes.filter(
|
|
1193
|
+
(index2) => !droppedForeignKeyNames.includes(index2.name)
|
|
1194
|
+
);
|
|
1159
1195
|
}
|
|
1160
|
-
const isMySQL = db.config.connection.client === "mysql";
|
|
1161
|
-
const ignoreForeignKeyNames = isMySQL ? [
|
|
1162
|
-
...table.foreignKeys.removed.map((fk) => fk.name),
|
|
1163
|
-
...table.foreignKeys.updated.map((fk) => fk.name)
|
|
1164
|
-
] : [];
|
|
1165
1196
|
for (const removedIndex of table.indexes.removed) {
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
dropIndex2(tableBuilder, removedIndex);
|
|
1169
|
-
}
|
|
1197
|
+
debug$2(`Dropping index ${removedIndex.name} on ${table.name}`);
|
|
1198
|
+
dropIndex2(tableBuilder, removedIndex, existingIndexes);
|
|
1170
1199
|
}
|
|
1171
1200
|
for (const updatedIndex of table.indexes.updated) {
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
dropIndex2(tableBuilder, updatedIndex.object);
|
|
1175
|
-
}
|
|
1201
|
+
debug$2(`Dropping updated index ${updatedIndex.name} on ${table.name}`);
|
|
1202
|
+
dropIndex2(tableBuilder, updatedIndex.object, existingIndexes);
|
|
1176
1203
|
}
|
|
1177
1204
|
for (const removedColumn of table.columns.removed) {
|
|
1178
1205
|
debug$2(`Dropping column ${removedColumn.name} on ${table.name}`);
|
|
@@ -1198,19 +1225,19 @@ const createHelpers = (db) => {
|
|
|
1198
1225
|
}
|
|
1199
1226
|
for (const updatedForeignKey of table.foreignKeys.updated) {
|
|
1200
1227
|
debug$2(`Recreating updated foreign key ${updatedForeignKey.name} on ${table.name}`);
|
|
1201
|
-
createForeignKey(tableBuilder, updatedForeignKey.object);
|
|
1228
|
+
createForeignKey(tableBuilder, updatedForeignKey.object, existingForeignKeys);
|
|
1202
1229
|
}
|
|
1203
1230
|
for (const updatedIndex of table.indexes.updated) {
|
|
1204
1231
|
debug$2(`Recreating updated index ${updatedIndex.name} on ${table.name}`);
|
|
1205
|
-
createIndex(tableBuilder, updatedIndex.object);
|
|
1232
|
+
createIndex(tableBuilder, updatedIndex.object, existingIndexes);
|
|
1206
1233
|
}
|
|
1207
1234
|
for (const addedForeignKey of table.foreignKeys.added) {
|
|
1208
|
-
debug$2(`Creating foreign
|
|
1209
|
-
createForeignKey(tableBuilder, addedForeignKey);
|
|
1235
|
+
debug$2(`Creating foreign key ${addedForeignKey.name} on ${table.name}`);
|
|
1236
|
+
createForeignKey(tableBuilder, addedForeignKey, existingForeignKeys);
|
|
1210
1237
|
}
|
|
1211
1238
|
for (const addedIndex of table.indexes.added) {
|
|
1212
1239
|
debug$2(`Creating index ${addedIndex.name} on ${table.name}`);
|
|
1213
|
-
createIndex(tableBuilder, addedIndex);
|
|
1240
|
+
createIndex(tableBuilder, addedIndex, existingIndexes);
|
|
1214
1241
|
}
|
|
1215
1242
|
});
|
|
1216
1243
|
};
|