@strapi/database 5.7.0-beta.0 → 5.8.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();
@@ -1074,29 +1082,37 @@ const createHelpers = (db) => {
1074
1082
  constraint.onUpdate(onUpdate);
1075
1083
  }
1076
1084
  };
1077
- const dropForeignKey = (tableBuilder, foreignKey) => {
1085
+ const dropForeignKey = (tableBuilder, foreignKey, existingForeignKeys) => {
1078
1086
  const { name, columns } = foreignKey;
1087
+ if (existingForeignKeys && !existingForeignKeys.some((existingIndex) => existingIndex?.name === name)) {
1088
+ debug$2(`Foreign Key ${name} not found in existing foreign keys. Skipping drop.`);
1089
+ return;
1090
+ }
1079
1091
  tableBuilder.dropForeign(columns, name);
1080
1092
  };
1081
1093
  const createIndex = (tableBuilder, index2) => {
1082
1094
  const { type, columns, name } = index2;
1083
1095
  switch (type) {
1084
1096
  case "primary": {
1085
- return tableBuilder.primary(columns, name);
1097
+ return tableBuilder.primary(columns, { constraintName: name });
1086
1098
  }
1087
1099
  case "unique": {
1088
- return tableBuilder.unique(columns, name);
1100
+ return tableBuilder.unique(columns, { indexName: name });
1089
1101
  }
1090
1102
  default: {
1091
1103
  return tableBuilder.index(columns, name, type);
1092
1104
  }
1093
1105
  }
1094
1106
  };
1095
- const dropIndex2 = (tableBuilder, index2) => {
1107
+ const dropIndex2 = (tableBuilder, index2, existingIndexes) => {
1096
1108
  if (!db.config.settings?.forceMigration) {
1097
1109
  return;
1098
1110
  }
1099
1111
  const { type, columns, name } = index2;
1112
+ if (existingIndexes && !existingIndexes.some((existingIndex) => existingIndex?.name === name)) {
1113
+ debug$2(`Index ${index2.name} not found in existingIndexes. Skipping drop.`);
1114
+ return;
1115
+ }
1100
1116
  switch (type) {
1101
1117
  case "primary": {
1102
1118
  return tableBuilder.dropPrimary(name);
@@ -1147,32 +1163,36 @@ const createHelpers = (db) => {
1147
1163
  }
1148
1164
  });
1149
1165
  };
1150
- const alterTable = async (schemaBuilder, table) => {
1151
- await schemaBuilder.alterTable(table.name, (tableBuilder) => {
1166
+ const alterTable = async (schemaBuilder, table, existingMetadata = {
1167
+ indexes: [],
1168
+ foreignKeys: []
1169
+ }) => {
1170
+ let existingIndexes = [...existingMetadata.indexes];
1171
+ const existingForeignKeys = [...existingMetadata.foreignKeys];
1172
+ const droppedForeignKeyNames = [];
1173
+ await schemaBuilder.alterTable(table.name, async (tableBuilder) => {
1152
1174
  for (const removedForeignKey of table.foreignKeys.removed) {
1153
1175
  debug$2(`Dropping foreign key ${removedForeignKey.name} on ${table.name}`);
1154
- dropForeignKey(tableBuilder, removedForeignKey);
1176
+ dropForeignKey(tableBuilder, removedForeignKey, existingForeignKeys);
1177
+ droppedForeignKeyNames.push(removedForeignKey.name);
1155
1178
  }
1156
1179
  for (const updatedForeignKey of table.foreignKeys.updated) {
1157
1180
  debug$2(`Dropping updated foreign key ${updatedForeignKey.name} on ${table.name}`);
1158
- dropForeignKey(tableBuilder, updatedForeignKey.object);
1181
+ dropForeignKey(tableBuilder, updatedForeignKey.object, existingForeignKeys);
1182
+ droppedForeignKeyNames.push(updatedForeignKey.object.name);
1183
+ }
1184
+ if (db.config.connection.client === "mysql") {
1185
+ existingIndexes = existingIndexes.filter(
1186
+ (index2) => !droppedForeignKeyNames.includes(index2.name)
1187
+ );
1159
1188
  }
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
1189
  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
- }
1190
+ debug$2(`Dropping index ${removedIndex.name} on ${table.name}`);
1191
+ dropIndex2(tableBuilder, removedIndex, existingIndexes);
1170
1192
  }
1171
1193
  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
- }
1194
+ debug$2(`Dropping updated index ${updatedIndex.name} on ${table.name}`);
1195
+ dropIndex2(tableBuilder, updatedIndex.object, existingIndexes);
1176
1196
  }
1177
1197
  for (const removedColumn of table.columns.removed) {
1178
1198
  debug$2(`Dropping column ${removedColumn.name} on ${table.name}`);
@@ -1205,7 +1225,7 @@ const createHelpers = (db) => {
1205
1225
  createIndex(tableBuilder, updatedIndex.object);
1206
1226
  }
1207
1227
  for (const addedForeignKey of table.foreignKeys.added) {
1208
- debug$2(`Creating foreign keys ${addedForeignKey.name} on ${table.name}`);
1228
+ debug$2(`Creating foreign key ${addedForeignKey.name} on ${table.name}`);
1209
1229
  createForeignKey(tableBuilder, addedForeignKey);
1210
1230
  }
1211
1231
  for (const addedIndex of table.indexes.added) {