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.
