@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/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
- await helpers2.alterTable(schemaBuilder, table);
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
- await schemaBuilder.alterTable(table.name, (tableBuilder) => {
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
- if (!ignoreForeignKeyNames.includes(removedIndex.name)) {
1167
- debug$2(`Dropping index ${removedIndex.name} on ${table.name}`);
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
- if (!ignoreForeignKeyNames.includes(updatedIndex.name)) {
1173
- debug$2(`Dropping updated index ${updatedIndex.name} on ${table.name}`);
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 keys ${addedForeignKey.name} on ${table.name}`);
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
  };