Guida alla risoluzione dei conflitti di migrazione di Prisma

Non eseguire prisma migrate reset su un database di produzione.

Se visualizzi un messaggio che indica che una migrazione è stata modificata o che è necessario resettare lo schema, fermati. Il reset eliminerà tutti i tuoi dati. Puoi risolvere questi conflitti manualmente senza perdere nulla.

Errori comuni di Prisma e come risolverli

Errore: Migrazione fallita durante l'esecuzione (P3018) • Correggi il file SQL. • Esegui: npx prisma migrate resolve --rolled-back [migration_name] • Esegui: npx prisma db execute --file [path_to_sql_file] • Esegui: npx prisma migrate resolve --applied [migration_name]

Errore: Migrazione modificata dopo l'applicazione (Mancata corrispondenza del checksum) • Calcola l'hash SHA-256 del tuo file di migrazione corrente. • Aggiorna il checksum nella tabella _prisma_migrations. • Importante: Aggiorna tutte le righe relative a quel nome di migrazione. Non filtrare per rolled_back_at.

Errore: Colonna mancante nel database shadow (P3006) • Questo accade quando una migrazione fa riferimento a una colonna creata da una migrazione successiva. • Prisma riproduce le migrazioni in ordine cronologico (timestamp). • Soluzione: Sposta il codice SQL nella migrazione in cui la colonna viene creata per la prima volta.

Errore: DROP COLUMN bloccato da una policy RLS • La Row Level Security di PostgreSQL lega le policy alle colonne. • Soluzione: Usa CASCADE quando elimini le colonne. • Esempio: ALTER TABLE "my_table" DROP COLUMN IF EXISTS "tenant_id" CASCADE;

Best practice per migrazioni sicure

  • Interroga prima il database. Non tirare a indovinare se una colonna o un indice esiste. Usa query SQL dirette per controllare lo schema effettivo del database prima di scrivere il codice di migrazione.
  • Usa IF EXISTS e IF NOT EXISTS. Questo rende le tue migrazioni idempotenti. Una migrazione idempotente può essere eseguita più volte senza causare errori.
  • Usa i blocchi DO per i vincoli (constraints). Avvolgi l'aggiunta di chiavi esterne (Foreign Key) in un controllo per verificare se il nome del vincolo esiste già.
  • Usa sempre CASCADE per le eliminazioni se utilizzi la Row Level Security.

Tabella riassuntiva

• P3018 (Fallita durante l'esecuzione): Correggi l'SQL, poi usa resolve --rolled-back e resolve --applied. • Mancata corrispondenza del checksum: Calcola il nuovo hash e aggiorna tutte le righe in _prisma_migrations. • Errore Shadow DB: Controlla l'ordine dei timestamp e sposta la logica SQL. • Errore RLS: Aggiungi CASCADE alle tue istruzioni DROP.

Fonte: https://dev.to/aswindanu_anwar_38c31d278/the-only-guide-you-need-for-prisma-migration-conflicts-without-losing-data-6bc