From f4773864233b4919f0f2f5993551db694eeec9dc Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Tue, 6 Feb 2024 17:26:48 -0500 Subject: [PATCH] feat: add references checks to migratiosn --- packages/db/src/core/cli/migration-queries.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/db/src/core/cli/migration-queries.ts b/packages/db/src/core/cli/migration-queries.ts index ed10de3ea2..a121c0f4a0 100644 --- a/packages/db/src/core/cli/migration-queries.ts +++ b/packages/db/src/core/cli/migration-queries.ts @@ -22,6 +22,7 @@ import { getCreateIndexQueries, getCreateTableQuery, getModifiers, + getReferencesConfig, hasDefault, schemaTypeToSqlType, } from '../queries.js'; @@ -103,8 +104,12 @@ export async function getCollectionChangeQueries({ const updated = getUpdatedFields(oldCollection.fields, newCollection.fields); let added = getAdded(oldCollection.fields, newCollection.fields); let dropped = getDropped(oldCollection.fields, newCollection.fields); + /** Any foreign key changes require a full table recreate */ + const hasForeignKeyChanges = Boolean( + deepDiff(oldCollection.foreignKeys, newCollection.foreignKeys) + ); - if (isEmpty(updated) && isEmpty(added) && isEmpty(dropped)) { + if (!hasForeignKeyChanges && isEmpty(updated) && isEmpty(added) && isEmpty(dropped)) { return { queries: getChangeIndexQueries({ collectionName, @@ -114,13 +119,14 @@ export async function getCollectionChangeQueries({ confirmations, }; } - if (!isEmpty(added) && !isEmpty(dropped)) { + if (!hasForeignKeyChanges && !isEmpty(added) && !isEmpty(dropped)) { const resolved = await resolveFieldRenames(collectionName, added, dropped, ambiguityResponses); added = resolved.added; dropped = resolved.dropped; queries.push(...getFieldRenameQueries(collectionName, resolved.renamed)); } if ( + !hasForeignKeyChanges && isEmpty(updated) && Object.values(dropped).every(canAlterTableDropColumn) && Object.values(added).every(canAlterTableAddColumn) @@ -432,6 +438,7 @@ function canAlterTableAddColumn(field: DBField) { if (hasRuntimeDefault(field)) return false; if (!field.optional && !hasDefault(field)) return false; if (hasPrimaryKey(field)) return false; + if (getReferencesConfig(field)) return false; return true; }