@strapi/database 5.7.0-beta.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.
@@ -1,7 +1,9 @@
1
1
  import type { Database } from '..';
2
- import type { Schema } from '../schema';
2
+ import type { ForeignKey, Index, Schema } from '../schema';
3
3
  export interface SchemaInspector {
4
4
  getSchema(): Promise<Schema>;
5
+ getIndexes(tableName: string): Promise<Index[]>;
6
+ getForeignKeys(tableName: string): Promise<ForeignKey[]>;
5
7
  getTables(): Promise<string[]>;
6
8
  }
7
9
  export default class Dialect {
@@ -1 +1 @@
1
- {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../src/dialects/dialect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,WAAW,eAAe;IAC9B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAChC;AAED,MAAM,CAAC,OAAO,OAAO,OAAO;IAC1B,EAAE,EAAE,QAAQ,CAAC;IAEb,eAAe,EAAE,eAAe,CAAyB;IAEzD,MAAM,EAAE,MAAM,CAAC;gBAEH,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;IAMxC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG;IAGd,UAAU,CAAC,iBAAiB,CAAC,EAAE,OAAO;IAI5C,SAAS;IAIT,UAAU,CAAC,IAAI,EAAE,OAAO;IAIxB,mBAAmB;IAInB,eAAe;IAIf,YAAY;IAIZ,gBAAgB;IAIhB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAKtC,iBAAiB;IAIjB,eAAe;IAIrB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;IAQlD,gBAAgB;CAGjB"}
1
+ {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../../src/dialects/dialect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACzD,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAChC;AAED,MAAM,CAAC,OAAO,OAAO,OAAO;IAC1B,EAAE,EAAE,QAAQ,CAAC;IAEb,eAAe,EAAE,eAAe,CAAyB;IAEzD,MAAM,EAAE,MAAM,CAAC;gBAEH,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;IAMxC,SAAS,CAAC,IAAI,CAAC,EAAE,GAAG;IAGd,UAAU,CAAC,iBAAiB,CAAC,EAAE,OAAO;IAI5C,SAAS;IAIT,UAAU,CAAC,IAAI,EAAE,OAAO;IAIxB,mBAAmB;IAInB,eAAe;IAIf,YAAY;IAIZ,gBAAgB;IAIhB,gBAAgB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO;IAKtC,iBAAiB;IAIjB,eAAe;IAIrB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE;IAQlD,gBAAgB;CAGjB"}
package/dist/index.js CHANGED
@@ -1071,6 +1071,13 @@ const createSchemaBuilder = (db) => {
1071
1071
  async updateSchema(schemaDiff) {
1072
1072
  const forceMigration = db.config.settings?.forceMigration;
1073
1073
  await db.dialect.startSchemaUpdate();
1074
+ const existingMetadata = {};
1075
+ for (const table of schemaDiff.tables.updated) {
1076
+ existingMetadata[table.name] = {
1077
+ indexes: await db.dialect.schemaInspector.getIndexes(table.name),
1078
+ foreignKeys: await db.dialect.schemaInspector.getForeignKeys(table.name)
1079
+ };
1080
+ }
1074
1081
  await db.connection.transaction(async (trx) => {
1075
1082
  await this.createTables(schemaDiff.tables.added, trx);
1076
1083
  if (forceMigration) {
@@ -1088,7 +1095,8 @@ const createSchemaBuilder = (db) => {
1088
1095
  for (const table of schemaDiff.tables.updated) {
1089
1096
  debug$2(`Updating table: ${table.name}`);
1090
1097
  const schemaBuilder = this.getSchemaBuilder(trx);
1091
- await helpers2.alterTable(schemaBuilder, table);
1098
+ const { indexes, foreignKeys } = existingMetadata[table.name];
1099
+ await helpers2.alterTable(schemaBuilder, table, { indexes, foreignKeys });
1092
1100
  }
1093
1101
  });
1094
1102
  await db.dialect.endSchemaUpdate();
@@ -1096,8 +1104,14 @@ const createSchemaBuilder = (db) => {
1096
1104
  };
1097
1105
  };
1098
1106
  const createHelpers = (db) => {
1099
- const createForeignKey = (tableBuilder, foreignKey) => {
1107
+ const createForeignKey = (tableBuilder, foreignKey, existingForeignKeys) => {
1100
1108
  const { name, columns, referencedColumns, referencedTable, onDelete, onUpdate } = foreignKey;
1109
+ const existingForeignKey = existingForeignKeys?.find((fk) => fk.name === name);
1110
+ const forceMigration = db.config.settings?.forceMigration;
1111
+ if (existingForeignKey && forceMigration) {
1112
+ debug$2(`Dropping existing foreign key ${name}`);
1113
+ tableBuilder.dropForeign(existingForeignKey.columns, name);
1114
+ }
1101
1115
  const constraint = tableBuilder.foreign(columns, name).references(referencedColumns).inTable(db.getSchemaName() ? `${db.getSchemaName()}.${referencedTable}` : referencedTable);
1102
1116
  if (onDelete) {
1103
1117
  constraint.onDelete(onDelete);
@@ -1110,25 +1124,34 @@ const createHelpers = (db) => {
1110
1124
  const { name, columns } = foreignKey;
1111
1125
  tableBuilder.dropForeign(columns, name);
1112
1126
  };
1113
- const createIndex = (tableBuilder, index2) => {
1127
+ const createIndex = (tableBuilder, index2, existingIndexes) => {
1114
1128
  const { type, columns, name } = index2;
1129
+ const existingIndex = existingIndexes?.find((existing) => existing.name === name);
1130
+ const forceMigration = db.config.settings?.forceMigration;
1131
+ if (forceMigration && existingIndex) {
1132
+ dropIndex2(tableBuilder, index2);
1133
+ }
1115
1134
  switch (type) {
1116
1135
  case "primary": {
1117
- return tableBuilder.primary(columns, name);
1136
+ return tableBuilder.primary(columns, { constraintName: name });
1118
1137
  }
1119
1138
  case "unique": {
1120
- return tableBuilder.unique(columns, name);
1139
+ return tableBuilder.unique(columns, { indexName: name });
1121
1140
  }
1122
1141
  default: {
1123
1142
  return tableBuilder.index(columns, name, type);
1124
1143
  }
1125
1144
  }
1126
1145
  };
1127
- const dropIndex2 = (tableBuilder, index2) => {
1146
+ const dropIndex2 = (tableBuilder, index2, existingIndexes) => {
1128
1147
  if (!db.config.settings?.forceMigration) {
1129
1148
  return;
1130
1149
  }
1131
1150
  const { type, columns, name } = index2;
1151
+ if (existingIndexes && !existingIndexes.some((existingIndex) => existingIndex?.name === name)) {
1152
+ debug$2(`Index ${index2.name} not found in existingIndexes. Skipping drop.`);
1153
+ return;
1154
+ }
1132
1155
  switch (type) {
1133
1156
  case "primary": {
1134
1157
  return tableBuilder.dropPrimary(name);
@@ -1179,32 +1202,36 @@ const createHelpers = (db) => {
1179
1202
  }
1180
1203
  });
1181
1204
  };
1182
- const alterTable = async (schemaBuilder, table) => {
1183
- await schemaBuilder.alterTable(table.name, (tableBuilder) => {
1205
+ const alterTable = async (schemaBuilder, table, existingMetadata = {
1206
+ indexes: [],
1207
+ foreignKeys: []
1208
+ }) => {
1209
+ let existingIndexes = [...existingMetadata.indexes];
1210
+ const existingForeignKeys = [...existingMetadata.foreignKeys];
1211
+ const droppedForeignKeyNames = [];
1212
+ await schemaBuilder.alterTable(table.name, async (tableBuilder) => {
1184
1213
  for (const removedForeignKey of table.foreignKeys.removed) {
1185
1214
  debug$2(`Dropping foreign key ${removedForeignKey.name} on ${table.name}`);
1186
1215
  dropForeignKey(tableBuilder, removedForeignKey);
1216
+ droppedForeignKeyNames.push(removedForeignKey.name);
1187
1217
  }
1188
1218
  for (const updatedForeignKey of table.foreignKeys.updated) {
1189
1219
  debug$2(`Dropping updated foreign key ${updatedForeignKey.name} on ${table.name}`);
1190
1220
  dropForeignKey(tableBuilder, updatedForeignKey.object);
1221
+ droppedForeignKeyNames.push(updatedForeignKey.object.name);
1222
+ }
1223
+ if (db.config.connection.client === "mysql") {
1224
+ existingIndexes = existingIndexes.filter(
1225
+ (index2) => !droppedForeignKeyNames.includes(index2.name)
1226
+ );
1191
1227
  }
1192
- const isMySQL = db.config.connection.client === "mysql";
1193
- const ignoreForeignKeyNames = isMySQL ? [
1194
- ...table.foreignKeys.removed.map((fk) => fk.name),
1195
- ...table.foreignKeys.updated.map((fk) => fk.name)
1196
- ] : [];
1197
1228
  for (const removedIndex of table.indexes.removed) {
1198
- if (!ignoreForeignKeyNames.includes(removedIndex.name)) {
1199
- debug$2(`Dropping index ${removedIndex.name} on ${table.name}`);
1200
- dropIndex2(tableBuilder, removedIndex);
1201
- }
1229
+ debug$2(`Dropping index ${removedIndex.name} on ${table.name}`);
1230
+ dropIndex2(tableBuilder, removedIndex, existingIndexes);
1202
1231
  }
1203
1232
  for (const updatedIndex of table.indexes.updated) {
1204
- if (!ignoreForeignKeyNames.includes(updatedIndex.name)) {
1205
- debug$2(`Dropping updated index ${updatedIndex.name} on ${table.name}`);
1206
- dropIndex2(tableBuilder, updatedIndex.object);
1207
- }
1233
+ debug$2(`Dropping updated index ${updatedIndex.name} on ${table.name}`);
1234
+ dropIndex2(tableBuilder, updatedIndex.object, existingIndexes);
1208
1235
  }
1209
1236
  for (const removedColumn of table.columns.removed) {
1210
1237
  debug$2(`Dropping column ${removedColumn.name} on ${table.name}`);
@@ -1230,19 +1257,19 @@ const createHelpers = (db) => {
1230
1257
  }
1231
1258
  for (const updatedForeignKey of table.foreignKeys.updated) {
1232
1259
  debug$2(`Recreating updated foreign key ${updatedForeignKey.name} on ${table.name}`);
1233
- createForeignKey(tableBuilder, updatedForeignKey.object);
1260
+ createForeignKey(tableBuilder, updatedForeignKey.object, existingForeignKeys);
1234
1261
  }
1235
1262
  for (const updatedIndex of table.indexes.updated) {
1236
1263
  debug$2(`Recreating updated index ${updatedIndex.name} on ${table.name}`);
1237
- createIndex(tableBuilder, updatedIndex.object);
1264
+ createIndex(tableBuilder, updatedIndex.object, existingIndexes);
1238
1265
  }
1239
1266
  for (const addedForeignKey of table.foreignKeys.added) {
1240
- debug$2(`Creating foreign keys ${addedForeignKey.name} on ${table.name}`);
1241
- createForeignKey(tableBuilder, addedForeignKey);
1267
+ debug$2(`Creating foreign key ${addedForeignKey.name} on ${table.name}`);
1268
+ createForeignKey(tableBuilder, addedForeignKey, existingForeignKeys);
1242
1269
  }
1243
1270
  for (const addedIndex of table.indexes.added) {
1244
1271
  debug$2(`Creating index ${addedIndex.name} on ${table.name}`);
1245
- createIndex(tableBuilder, addedIndex);
1272
+ createIndex(tableBuilder, addedIndex, existingIndexes);
1246
1273
  }
1247
1274
  });
1248
1275
  };